題目鏈接: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;
}