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;
}
思路:这道题说到底就是用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;
}
相关文章推荐
- 展示组织机构的树形组件
- 批处理
- 机器学习实战--kMeans
- jquery validate自定义扩展实例,以及一些常用验证
- Android自定义Dialog带Dialog的显示消失动画(一)
- GCC内嵌汇编
- Light OJ 1354 IP Checking
- 委托开发合同与合作开发合同的区别
- xUtils的介绍
- 简洁的滚动鼠标 改变图片大小js
- Linux的僵尸进程处理2
- C# 中const和readonly的区别
- NGUI实现Sprite裁切成圆形或者椭圆形(不完美)
- MyEclipse Trial Expired,手动注册MyEclipse
- static使用小结
- html5-detial
- html5-detial
- 根据官方api调用百度地图定位
- php单例
- POJ 2456 Aggressive cows(二分查找 最大化最小值)