暑期dp46道(11)——HDOJ 1422重温世界杯 dp+记忆化搜索
来源:互联网 发布:将拍成网络剧的小说 编辑:程序博客网 时间:2024/05/15 09:41
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422
解题思路:这题刚开始用的暴力
(一)首先第i个城市的裸剩余费用:data[i]=a-b(可能为0或负)
(二)然后按照游览方向递推直到当前所在城市的裸费用不足0记录之前已浏览的城市数目,
(三)枚举i:1->n求最大值
不出预料:TLE
所以就想到了 昨天一道dfs+记忆化搜索的题目,想到用一个need[]记录从当前城市出发到最后一个因费用不够被强制退出时的裸费用之和,所以need[]一般为负(所有城市游览都顺利的情况除外)
所以这题要从后往前遍历:
依靠记录的dp[]和need[]“平移”,降低时间复杂度。
detail:
1.如果出发点(第i个城市)裸费用为负,则
if(temp<0) { dp[i]=0; need[i]=temp; }
2.data[i]>=0向后搜索j:i+1->i+1(处理边界问题)
如果
dp[j]存在,凭借dp[j]和need[j]移动跳过从j出发即可顺利浏览的部分
if(dp[j]) { temp+=need[j]; j=T(j+dp[j],n); }
继续遍历:如果费用不足记录dp[i](方向问题)
if(temp<0) { need[i]=temp; if(j>i) dp[i]=j-i; else dp[i]=n+j-i; break; }
PS:一定要注意边界问题,刚开始用的求余,比较麻烦,后来写了一个处理边界问题
#define T(a,b) ((a>b)?a-b:a)
Code:
#include<cstdio>#include<cstring>#include<string>#include<queue>using namespace std;#define Max(a,b) ((a>b)?a:b)#define M(a) memset(a,0,sizeof(a))#define T(a,b) ((a>b)?a-b:a)#define debug 0const int maxn=100000+5;int data[maxn],dp[maxn],need[maxn];int n;void Do(){int j,ans=0;for(int i=n;i>=1;i--)//从后往前{int temp=data[i];if(temp<0){dp[i]=0;need[i]=temp;}else{for(j=T(i+1,n);j!=i;j=T(j+1,n)){if(dp[j]){temp+=need[j];j=T(j+dp[j],n);}else{temp+=data[j];}if(temp<0){need[i]=temp; if(j>i)dp[i]=j-i;elsedp[i]=n+j-i;break;} }if(j==i){printf("%d\n",n);return;}}ans=Max(ans,dp[i]);}printf("%d\n",ans);}int main(){#if debugfreopen("in.txt","r",stdin);#endif //debugint a,b;while(~scanf("%d",&n)){M(dp);M(need);for(int i=1;i<=n;i++){scanf("%d%d",&a,&b);//printf("%d %d\n",a,b);data[i]=a-b;}Do();}return 0;}
0 0
- 暑期dp46道(11)——HDOJ 1422重温世界杯 dp+记忆化搜索
- 暑期dp46道(26)HDOJ 1501 Zipper dfs+记忆化搜索
- 暑期dp46道(41)--HDOJ 1978 How many ways dfs + 记忆化搜索
- 【DP】 HDOJ 1422 重温世界杯
- hdoj 1422 重温世界杯 【DP】
- 暑期dp46道(15)--HDU 1080 Human Gene Functions DFS+记忆化搜索
- 暑期dp46道(19)HDU 1078 FatMouse and Cheese dfs+记忆化搜索
- 暑期dp46道(6)抢劫Robberies ——HDOJ 2955
- HDOJ 1422 重温世界杯
- HDOJ-1422 重温世界杯
- HDOJ 1422 重温世界杯
- hdoj-1422重温世界杯
- 暑期dp46道(24)HDOJ 1074 Doing Homework 状压dp
- 暑期dp46道(5)hdoj 1421 搬寝室s
- 暑期dp46道(21)HDOJ 2059 龟兔赛跑
- 暑期dp46道(25)--HDOJ 1300 Pearls
- 暑期dp46道(30) HDOJ 1227 Fast Food
- hdu 1422 重温世界杯(dp)
- 认识CoreData—使用进阶
- xib传值
- CCS5.5环境下使用clock()函数测试程序段运行时间
- 利用Reflection反射将对象转化为 List和Model
- POJ 3254 状态压缩DP入门
- 暑期dp46道(11)——HDOJ 1422重温世界杯 dp+记忆化搜索
- TCP/IP、Http、Socket的区别
- 03-树1 树的同构
- 英方云灾备软件 V5.6.9949 32位官方版
- 【第一章:dojo】3)实现静态变量
- 常用Util类集合
- 中断及定时器实现时钟功能
- Java关键字final
- 六种常用算法——转载