floyd+动态规划 hdu-4571-Travel in time
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4571
题目大意:
有n个景点,每个点都有个游玩时间ci,游玩后得到的满意度si。给一个起点s和终点e,两个景点间有条无向边,权值为时间。从起点出发,在给定时间限制下,到达终点,问能获得的最大的满意值,只有游玩了景点才能获得该景点的满意值,并且上个游玩景点的满意度必须大于后一个游玩的景点满意度。
解题思路:
图上的dp.
见到图论就晕啊啊啊。先求出不游玩时,任意两点的到达时间,用floyd求。
dp[i][j]表示到达第i个点,用时为j时,能到达的最大的满意度。
本题的关键是先对每个景点的满意度从小到大排序,然后对于第i个景点枚举时间j(从大到小,因为一个景点只能游一次), 在枚举前面的i-1个景点,通过前面的满意度得出当前的满意度。转移方程还是很好写的。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
#define Maxn 110
int dp[Maxn][310]; //dp[i][j]表示到达第i个点花了j时间的能获得的最大满意度
int dis[Maxn][Maxn]; //任意两点间的距离
int n,m; struct Node
{
int id,si,ci;
friend bool operator < (const struct Node &a,const struct Node &b)
{
return a.si<b.si; //按满意度从小到大排序
}
}node[Maxn]; void floy()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j)
dis[i][j]=0; //不游玩的到达时间
else
dis[i][j]=INF;
}
int a,b,v;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&v); //注意有重边
dis[a][b]=dis[b][a]=min(dis[a][b],v);
} for(int k=0;k<n;k++) //floyd 不断更新两点间的距离
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
return ;
} int main()
{
int tt,s,e,t;
int ca=0; scanf("%d",&tt);
while(tt--)
//while(~scanf("%d%d%d%d%d",&n,&m,&t,&s,&e))
{
scanf("%d%d%d%d%d",&n,&m,&t,&s,&e);
for(int i=0;i<n;i++)
{
scanf("%d",&node[i].ci);
node[i].id=i;
}
for(int i=0;i<n;i++)
scanf("%d",&node[i].si);
sort(node,node+n);
floy(); printf("Case #%d:\n",++ca);
if(dis[s][e]>t) //起点不能到达终点或到达时间超过了
{
puts("0");
continue;
}
memset(dp,-1,sizeof(dp));
int ans=0;
for(int i=0;i<n;i++) //初始化
{
if(dis[s][node[i].id]+node[i].ci<=t)
{
dp[node[i].id][node[i].ci+dis[s][node[i].id]]=node[i].si;
// dp[node[i].id][dis[node[s].id][node[i].id]]=0;
}
if(t-dis[s][node[i].id]-node[i].ci>=dis[node[i].id][e])
ans=max(ans,node[i].si);
} for(int i=1;i<n;i++)
for(int j=t;j>=0;j--)
{
for(int k=0;k<i;k++)
{
int tmp=j-node[i].ci-dis[node[k].id][node[i].id]; //注意是严格大于
if(tmp>=0&&node[i].si>node[k].si&&dp[node[k].id][tmp]!=-1)
dp[node[i].id][j]=max(dp[node[i].id][j],dp[node[k].id][tmp]+node[i].si);
}
if(t-j>=dis[node[i].id][e]) //该点的所有时间都求完了
ans=max(ans,dp[node[i].id][j]);
}
printf("%d\n",ans);
}
return 0;
}
floyd+动态规划 hdu-4571-Travel in time的更多相关文章
- HDU 4571 Travel in time ★(2013 ACM/ICPC长沙邀请赛)
[题意]给定N个点,每个点有一个停留所需的时间Ci,和停留能够获得的满意度Si,有M条边,每条边代表着两个点走动所需的时间ti,现在问在规定的T时间内从指定的一点S到E能够获得的最大的满意度是多少?要 ...
- HDU 4571 Travel in time(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alone. Yu ...
- UVa 104 - Arbitrage(Floyd动态规划)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- hdu 5380 Travel with candy(双端队列)
pid=5380">题目链接:hdu 5380 Travel with candy 保持油箱一直处于满的状态,维护一个队列,记录当前C的油量中分别能够以多少价格退货,以及能够推货的量. ...
- hdu 4571 floyd+动态规划
思路: 我们先求一遍floyd,将各点的最短距离求出,然后将点按si的升序排序.dp[i][k]表示第i个点在第j时间所获得的最大效益,那么 dp[i][k]=max(dp[ i ][ k ] , ...
- hdu 4284 Travel(壮压DP&TSP&floyd)
Travel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 4284 Travel(floyd + TSP)
虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...
- HDU - 4284 Travel(floyd+状压dp)
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...
- dp 动态规划 hdu 1003 1087
动态规划就是寻找最优解的过程 最重要的是找到关系式 hdu 1003 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意:求最大字序列和, ...
随机推荐
- WF学习笔记(一)
-流程启动方式1: WorkflowInvoker.Invoke(new Workflow1()); -流程启动方式2: WorkflowApplication instance = new Work ...
- MySql数据库3【优化3】缓存设置的优化
1.表缓存 相关参数: table_open_cache 指定表缓存的大小.每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容.通过检查峰值时间的状 ...
- uboot使用tftp下载时出现“checksum bad”问题原因分析
一.问题 二.原因分析 你的虚拟机是不是这样设置的呢? 如果是的话,请看下边的解释: 使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说,使用NA ...
- smtp协议
一.smtp命令 1.HELO 向服务器标识用户身份 2.MAIL 初始化邮件传输mail from: <xxx> 3.RCPT 标识单个的邮件接收人:常在MAIL命令后面可有多个rcpt ...
- 搞Solr这一年(本人QQ 282335345 群412268049 欢迎大家一起学习Solr 非诚勿扰)
搞Solr这一年 去年6月份毕业到现在已经快一年半了,很庆幸从事了搜索引擎这份工作,虽然谈不上有多深入,但至少已经入门了.在这一年半里,搞了3个月的hbase和mapreduce,搞了一个月的nutc ...
- TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)
前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...
- c#获取带有汉字的字符串长度
不知道大家注意没,用c#下自带的str.Length方法获得字符串str长度的时候,返回的总是字符的个数,但是如果字符串中包含汉字的话,一个汉字是占两个字符长度的,获取的长度值就有了问题. 解决方案: ...
- Android 中使用MediaRecorder进行录像详解(视频录制)
在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. package com.video; import java.io.IOException; import android.ap ...
- 今天愉快的hack小记
今天发生了一件很好玩的事情...那就是WZJ的数据结构(负五)被人水掉了...用的是线段树暴力大发好... XYZ折腾了多长时间的论文题就这么被搞掉了...?窝来维护正义了! 怎么卡呢:让线段树走到叶 ...
- WordPress Duplicator 0.4.4 Cross Site Scripting
测试方法: 提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! Advisory ID: HTB23162 Product:DuplicatorWordPressPlugin Vend ...