这道题使用DFS这DP都能做出来,用DP效率更快的,我看到这个条件反射就用DFS做了。。。。。
大概是给你一个DAG图(城市地图),结点编号(城市编号),权值(兴趣点),然后找一条通路,使他的总权值最大!!!dfs搜索即可~~
ac代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<memory>
#include <cstring>
using namespace std;
const int maxn=200;
int G[maxn][maxn];//储存图
int ins[maxn];//兴趣点
int circle[maxn];//储存路径
int sum;//总的值
int t,n,m,x,y;
int ans[maxn];//储存答案的路径
int len;
void dfs(int u,int dep,int val)
{
if(u==n+1)
{
if(val>sum)//判断
{
sum=val;
for(int i=1;i<=dep;i++)
ans[i]=circle[i];
len=dep;
}
return;
}
for(int i=u+1;i<=n+1;i++)//从u+1开始
if(G[u][i])
{
circle[dep]=i;
dfs(i,dep+1,val+ins[i]);
}
}
int main()
{
// freopen("1.txt","r",stdin);
int kase=0;
scanf("%d",&t);
while(t--)
{
memset(G,0,sizeof(G));//初始化
memset(ins,0,sizeof(ins));
memset(circle,0,sizeof(circle));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&ins[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)//建立图
{
scanf("%d %d",&x,&y);
G[x][y]=1;
}
sum=0;
circle[1]=1;
dfs(1,2,0);
printf("CASE %d#\npoints : %d\n",++kase,sum);
printf("circuit : ");
for(int i=1;i<=len-2;i++)
printf("%d->",ans[i]);
printf("%d\n",ans[len-1]-n);
printf("\n");
}
}