http://acm.hdu.edu.cn/showproblem.php?pid=1224
题目大意:给出一些城市的point,从起点出发经过一些城市最终回到起点,在这个过程中经过的下一个城市的point值要求不低于现在城市的point值(最后回到城市1的情况不算),问最后能够达到的最大point值之和,并输出路径。
直接动态规划;转台转移方程 for i <- 1 to n for j <- 1 to n if point[i]<point[j] and f[i]+point[i]>f[j] then f[j]=f[i]+point[i],pre[i]=i end if.其间用一个数组pre[]保留路径,方便之后输出结果。
hdu1224
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 111; int f[N], point[N] , pre[N], go[N][N]; void putans(int u) { if(u == -1) return; putans(pre[u]); printf("%d->",u); } int main() { int T , n , cas = 1; scanf("%d",&T); while(T--) { if(cas > 1) puts(""); printf("CASE %d#\n",cas++); scanf("%d",&n); n += 1; for(int i=1;i<n;i++) scanf("%d",&point[i]); point[n] = 0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { go[i][j] = 0; } for(int i=1;i<=n;i++) f[i] = 0 , pre[i] = -1; int m; scanf("%d",&m); while(m--) { int u , v; scanf("%d%d",&u,&v); go[u][v] = 1; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(go[i][j] && f[i]+point[i] > f[j]) { f[j] = f[i] + point[i]; pre[j] = i; } } printf("points : %d\n",f[n]); printf("circuit : 1->"); putans(pre[n]); printf("1\n"); } return 0; }