您的位置:首页 > 其它

hdu 1224【Free DIY Tour】

2012-08-16 20:54 405 查看
如果从i->j有路的话,dp[j] = max(dp[j],dp[i]+value[j]),并记录下path[j],如果选择的是dp[i]+value[j],则path[j] = i;之后回溯就可以找到所有路径了……其实这一题可以用压缩版的数组(其实一维数组啦)存储是否有路径,可以节约一半的空间(因为一个地方只有到另外一个编号比它大的城市的路),为了方便我还是用的二维数组^_^

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>

int dp[105];
char map[105][105];
int path[105];
int value[105];

int main()
{
int cases;
int n;
int cas = 1;

scanf("%d",&cases);
while(cases --)
{
scanf("%d",&n);
value[n+1] = 0;
for(int i = 1;i <= n;i ++)
{
scanf("%d",&value[i]);
}

int m;
scanf("%d",&m);
memset(map,false,sizeof(map));
for(int i = 0;i < m;i ++)
{
int p,r;
scanf("%d%d",&p,&r);
map[p][r] = true;
}
memset(dp,0,sizeof(dp));

for(int i = 1;i <= n + 1;i ++)
{
for(int j = i + 1;j <= n + 1;j ++)
{
if(map[i][j])
{
if(dp[i] + value[j] > dp[j])
{
dp[j] = dp[i] + value[j];
path[j] = i;
}
}
}
}
if(cas > 1)
printf("\n");
printf("CASE %d#\n",cas ++);
printf("points : %d\n",dp[n+1]);
int ans[105];
int i = n+1;
int step = 0;
while(i != 1)
{
ans[step] = path[i];
i = path[i];
step ++;
}
printf("circuit : ");
for(int j = step - 1;j>= 0;j --)
{
printf("%d->",ans[j]);
}
printf("1\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: