hdu 1224 Free DIY Tour 【动态规划】

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;
}

 

 

posted @ 2013-03-27 12:59  aiiYuu  阅读(973)  评论(0编辑  收藏  举报