题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1224
题意:求最长上升子序列,有路径限制
#include <stdio.h>
#include <string.h>
int dp[120];
int map[120][120];
int pre[120];
int num[120];
void p(int x)
{
if(pre[x] == 1)
{
printf("1->");
return;
}
else p(pre[x]);
printf("%d->",pre[x]);
}
int main()
{
int test,tmp;
int a,b,n;
int i,j,k;
scanf("%d",&test);
for(k = 1; k <= test; k++)
{
memset(map,0,sizeof(map));
scanf("%d",&n);
for(i = 1; i <= n; i++)
{
scanf("%d",&num[i]);
dp[i] = 0;
pre[i] = 0;
}
scanf("%d",&tmp);
for(i = 1; i <= tmp; i++)
{
scanf("%d %d",&a,&b);
map[a][b] = 1;
}
n++;
dp[n] = 0;
pre[i] = 0;
num[n] = 0;//去掉试试
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(dp[j]+num[i] > dp[i] && map[j][i])
{
dp[i] = dp[j]+num[i];
pre[i] = j;
}
}
}
printf("CASE %d#\npoints : %d\ncircuit : ",k,dp[n]);
p(n);
printf("1\n");
if(k != test)
printf("\n");
}
return 0;
}