题目链接:点击打开链接
题意:
是有n个城市,每个城市有一个魅力值,要你从第一个城市出发,每次只能到比你所在城市标号大的城市,最后到下标为n+1的城市(就是1城市),求缩经过的城市最大魅力值之和。
思路:把每种情况列出来就好了
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+10;
const int INF=0x3f3f3f3f;
int a[maxn][maxn],d[maxn],m[maxn],out[maxn],n;
void print_ans(int i)
{
if(!i)return ;
print_ans(out[i]);
if(i==n+1)printf("1\n");
else printf("%d->",i);
}
int main()
{
int i,j,T,k,ans=0;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
memset(m,0,sizeof(m));
memset(d,0,sizeof(d));
memset(out,0,sizeof(out));
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&m[i]);
m[n+1]=m[1];
scanf("%d",&k);
while(k--)
{
scanf("%d %d",&i,&j);
a[i][j]=1;
}
d[1]=m[1];
for(i=2;i<=n+1;i++)
{
for(j=1;j<i;j++)
if(a[j][i])
{
if(d[i]<d[j]+m[i])
{
d[i]=d[j]+m[i];
out[i]=j;
}
}
}
printf("CASE %d#\n",++ans);
printf("points : %d\n",d[n+1]);
printf("circuit : ");
print_ans(n+1);
if(T!=0)printf("\n");
}
return 0;
}