先是AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int N=105;
int father[N];
int v[N];
int dp[N];
bool map[N][N];
void print(int n)
{
if(n==-1)return;
print(father[n]);
printf("%d->",n);
}
int main()
{
int m,n,w,a,b;
scanf("%d",&m);
for(int kase=1;kase<=m;++kase)
{
memset(dp,0,sizeof(dp));
memset(map,0,sizeof(map));
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&v[i]);
v[n+1]=0;
scanf("%d",&w);
for(int i=1;i<=w;++i)scanf("%d%d",&a,&b),map[a][b]=true;
father[1]=-1;
for(int i=1;i<=n+1;++i)
for(int j=1;j<i;j++)
{
if(map[j][i]&&dp[j]+v[i]>dp[i])
{
dp[i]=dp[j]+v[i];
father[i]=j;
}
}
printf("CASE %d#\n",kase);
printf("points : %d\n",dp[n+1]);
printf("circuit : ");
print(father[n+1]);
printf("1\n");
if(kase!=m)printf("\n");
}
return 0;
}
以下代码一直Wa,择日检查:
#include <iostream>
#include <string.h>
using namespace std;
const int N = 105;
int fav[N];
int dp[N];
int map[N] [N];
int main()
{
int t;
cin >> t;
int cnt = 1;
while(t--)
{
int n;
cin >> n;
memset(fav, 0, sizeof(fav));
for(int i = 1; i <= n; i++)
cin >> fav[i];
fav[n+1] = 0;
int m = 0;
cin >> m;
for(int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
map[a] [b] = 1;
}
memset(dp, 0, sizeof(dp));
int pre[N];
memset(pre, 0, sizeof(pre));
for(int i = 1; i <= n + 1; i++ )
{
for(int j = 1; j < i; j++)
{
if(map[j][i] && dp[j] + fav[i] > dp[i])
{
dp[i] = dp[j] + fav[i];
pre[i] = j;
}
}
}
int order[N];
order[1] = 1;
int cnt2 = 1;
int temp = pre[n+1];
for(int i =2; temp != 0; i++)
{
order[i] = temp;
temp = pre[temp];
cnt2++;
}
printf("CASE %d#\n",cnt);
printf("points : %d\n",dp[n+1]);
printf("circuit : ");
for(int i = 1; i < cnt2; i++)
cout << order[i] << "->";
cout << 1 << endl;
if(t != 0)
cout << endl;
}
return 0;
}