hdu 1224【Free DIY Tour】
2012-08-16 20:54
405 查看
如果从i->j有路的话,dp[j] = max(dp[j],dp[i]+value[j]),并记录下path[j],如果选择的是dp[i]+value[j],则path[j] = i;之后回溯就可以找到所有路径了……其实这一题可以用压缩版的数组(其实一维数组啦)存储是否有路径,可以节约一半的空间(因为一个地方只有到另外一个编号比它大的城市的路),为了方便我还是用的二维数组^_^
代码如下:
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> int dp[105]; char map[105][105]; int path[105]; int value[105]; int main() { int cases; int n; int cas = 1; scanf("%d",&cases); while(cases --) { scanf("%d",&n); value[n+1] = 0; for(int i = 1;i <= n;i ++) { scanf("%d",&value[i]); } int m; scanf("%d",&m); memset(map,false,sizeof(map)); for(int i = 0;i < m;i ++) { int p,r; scanf("%d%d",&p,&r); map[p][r] = true; } memset(dp,0,sizeof(dp)); for(int i = 1;i <= n + 1;i ++) { for(int j = i + 1;j <= n + 1;j ++) { if(map[i][j]) { if(dp[i] + value[j] > dp[j]) { dp[j] = dp[i] + value[j]; path[j] = i; } } } } if(cas > 1) printf("\n"); printf("CASE %d#\n",cas ++); printf("points : %d\n",dp[n+1]); int ans[105]; int i = n+1; int step = 0; while(i != 1) { ans[step] = path[i]; i = path[i]; step ++; } printf("circuit : "); for(int j = step - 1;j>= 0;j --) { printf("%d->",ans[j]); } printf("1\n"); } return 0; }
相关文章推荐
- HDU 1224 Free DIY Tour--DP--(bug集锦)
- hdu1224 Free DIY Tour 动态规划
- hdu 1224 Free DIY Tour 【动态规划】
- 【数塔DP|最长路】HDU-1224 Free DIY Tour
- HDU 1224 Free DIY Tour(简单dp?+记录路径)
- HDU1224 Free DIY Tour(spfa+记录路径)
- hdu 1224 Free DIY Tour(最长路/dp)
- HDU 1224 Free DIY Tour
- HDU1224-Free DIY Tour(SPFA+路径还原)
- HDU 1224 Free DIY Tour 简单DP
- hdu 1224 Free DIY Tour(dp)
- HDU - 1224 Free DIY Tour 【DAG求最长路】
- hdu 1224 Free DIY Tour (DAG 最长路)
- HDU1224 Free DIY Tour(最短路变形,最长路打印路径,spfa)
- HDU-1224 Free DIY Tour 最长上升子序列
- HDU 1224 Free DIY Tour(DP)
- hdu 1224 Free DIY Tour(最长的公路/dp)
- hdu 1224 Free DIY Tour【SPFA最长路+输出路径】
- [HDU] 1224 Free DIY Tour -使用BELLMAN-FORD处理有向无回路图
- HDU1224 Free DIY Tour(spfa+记录路径)