Uva 10131-Is Bigger Smarter?(DP)

来源:互联网 发布:淘宝评论不见了 编辑:程序博客网 时间:2024/06/05 03:00

题目链接:点击打开链接

DAG(有向无环图)上的最长路+打印路径
建图很简单,对于两点 a b, 能够由a到b的条件是w[a]<w[b]&&s[a]>s[b] 注意是有向图。
设dp[i] 为以i为起点的最长路的长度,dp[i]= max(dp[i],dp[j]+1)  枚举j (j是和i相连的点) 
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#include <cctype>#include <vector>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define maxn 1010#define _ll __int64#define ll long long#define INF 0x3f3f3f3f#define Mod 1000000007#define pp pair<int,int>#define ull unsigned long longusing namespace std;int p,w[maxn],s[maxn],dp[maxn];bool ma[maxn][maxn];void build(){memset(ma,0,sizeof(ma));for(int i=1;i<p;i++){for(int j=i+1;j<p;j++){if(w[i]<w[j]&&s[i]>s[j])ma[i][j]=1;else if(w[j]<w[i]&&s[j]>s[i])ma[j][i]=1;}}}int dfs(int x){int& ans=dp[x];if(ans>0) return ans;ans=1;for(int i=1;i<p;i++)if(ma[x][i])ans=max(ans,dfs(i)+1);return ans;}void output(int x){printf("%d\n",x);for(int i=1;i<p;i++)if(ma[x][i]&&dp[x]==dp[i]+1){output(i);break;    }}int main(){p=1;while(scanf("%d %d",w+p,s+p)!=EOF)++p;build();memset(dp,-1,sizeof(dp));int ans=-INF,indx;for(int i=1;i<p;i++)if(ans<dfs(i))    {ans=dp[i];indx=i;    }printf("%d\n",ans);output(indx);    return 0;}


0 0
原创粉丝点击