您的位置:首页 > 其它

HDU 1224 Free DIY Tour(DP求最短路)

2016-03-25 16:26 381 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1224

思路:这道题说到底就是用DP求最短路,之所以能用DP,是因为题目中说了,飞机只能从标号低的城市到标号高的城市,具有无后向性,给个DP求最短路的地址:
http://wenku.baidu.com/link?url=uaaG3egZKZtEiUiSWtlK28XI9O0Jw7R92s-kkRvaLIyK01FhGk9d_BCr-OgM-4XZYNu3K0lhZcuiwm7Z54cAqR0VC3qAAPoQrtb6I75xqu3
AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int map1[110][110];
int value[110];
int dp[110];
int pre[110];
int n;
void shuchu(int x)
{
if(pre[x] == 0)
{
printf("%d",x);
return;
}
else
{
shuchu(pre[x]);
if(x == n+1)
printf("->1");
else
printf("->%d",x);
}
}
int main()
{
int t;
scanf("%d",&t);
for(int cas=1; cas<=t; cas++)
{
memset(dp,-1,sizeof(dp));
memset(map1,-1,sizeof(map1));
memset(pre,0,sizeof(pre));
int m;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int a;
scanf("%d",&a);
value[i] = a;
}
value[n+1] = 0;
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
map1[a][b] = value[b];
}
dp[1] = value[1];
for(int i=2; i<=n+1; i++)
{
for(int j=1; j<i; j++)
{
if(map1[j][i] != -1 && dp[j] + map1[j][i] > dp[i])
{
dp[i] = dp[j] + map1[j][i];
pre[i] = j;
}
}
}
printf("CASE %d#\n",cas);
printf("points : %d\n",dp[n+1]);
printf("circuit : ");
shuchu(n+1);
if(cas != t)
printf("\n\n");
else
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: