HDU 1224 Free DIY Tour(DP)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1224


題目大意:給出每個城市的快樂值,再給出城市之間的通道,讓你求出從1城市 回到 1城市的最大快樂值之和


解題思路: 最長上升子序列. 狀態方程爲:if(Map[i][j]&& dp[i] + num[j] > dp[j]) dp[j] = dp[i] + num[j];


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 111;
int father[maxn];
int num[maxn];
int dp[maxn];
int Map[maxn][maxn];

void show(int n)
{
    if(n==father[n]){cout<<n;return;}
    show(father[n]);
    cout<<"->"<<n;
}
int main ()
{
    int T, t = 1;
    scanf("%d", &T);
    while(T--)
    {
        memset(dp, 0, sizeof(dp));
        memset(num, 0, sizeof(num));
        memset(Map, 0, sizeof(Map));

        int n, m;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
            scanf("%d", &num[i]), father[i]=1;

        scanf("%d", &m);
        for(int i = 1;i <= m; i++)
        {
            int a, b;
            scanf("%d %d", &a, &b);
            Map[a][b] = 1;
        }
        
        for(int i = 1; i <= n; i++)
            for(int j = i+1; j <= n+1; j++)
                if(Map[i][j]&& dp[i] + num[j] > dp[j])
                {
                    dp[j] = dp[i] + num[j];
                    father[j]=i;
                }
                
                
        printf("CASE %d#\n",t++);
        printf("points : %d\n",dp[n+1]);
        printf("circuit : ");
        show(father[n+1]);
        printf("->%d\n",1);
        if(T!=0) printf("\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章