万能的搜索,用广搜来解决DP问题ZZNU -2046 : 生化危机 / HDU 1260:Tickets
Posted 好好学习,天天向上
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万能的搜索,用广搜来解决DP问题ZZNU -2046 : 生化危机 / HDU 1260:Tickets相关的知识,希望对你有一定的参考价值。
2046 : 生化危机
时间限制:1 Sec内存限制:128 MiB
提交:19答案正确:8
题目描述
当致命的T病毒从Umbrella Corporation 逃出的时候,地球上大部分的人都死去了。
麻烦的是,他们并没有真正的死去。
爱丽诗在一个狭窄的巷子中,遇见了n个丧尸(编号1-n),巷子太窄了,爱丽诗只能按顺序解决它们。
爱丽诗擅长用匕首和弓箭,当爱丽诗面临编号为i的丧尸时,匕首每次只能解决一个丧尸用时为a[i],弓箭每次能且只能解决两个相邻的丧尸(丧尸i,和丧尸i+1),用时为b[i]。
爱丽诗看了下时间正好是20:00:00,那么爱丽诗最快能在什么时刻解决战斗呢?
输入
先输入一个正整数T(0<T<15),代表有T组数据,对于每组数据包含三行内容
第一行输入一个正整数n,代表丧尸的个数
第二行输入n个整数,分别代表用匕首解第i个丧尸决所花费的时间(单位为秒)
第三行输入n-1个整数,分别代表用弓箭同时解决第i个和第i+1个丧尸所用的时间(单位为秒)。
所有输入均不超过 100000
输出
对于每组数据,输出爱丽诗能够解决战斗的最早时间
样例输入
复制
1 2 1 3 4
样例输出
复制
20:00:04
提示
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> //这两个题存在惊人的相似程度, 原因其实也很简单--你想 #include<queue> using namespace std; int k,n,w[1000],a[1000],b[1000],ans[1000]; struct node { int x; int step; }; void bfs() ; int main() { int i,T; cin>>T; while(T--) { memset(ans,0,sizeof(ans));k=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); cin>>n; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n-1;i++) scanf("%d",&b[i]); bfs(); sort(ans,ans+k); int t=ans[0]; int h=20,m=0,s=0; h=(h+t/3600)%24; m=(t/60)%60; s=t%60; printf("%02d:%02d:%02d\n",h,m,s); } return 0; } void bfs() //激活下面的注释区,你将看到整个搜索的大致过程 { memset(w,0,sizeof(w)); queue<node>Q; struct node q,p; q.x=0;q.step=0; Q.push(q);// cout<<q.x<<" "<<q.step<<" "; while( Q.size()>0 ) { p=Q.front(); Q.pop(); for(int i=0;i<=1;i++) { if(p.step>=n) { ans[k++]=p.x;//cout<<p.x<<" "<<p.step<<" "; continue; } if(i==0&&(p.step+1<=n)) { q.x=p.x+ a[p.step+1];q.step=p.step+1; } else if((i==1)&&(p.step+2<=n)) { q.x=p.x+ b[p.step+1];q.step=p.step+2; } else{} // cout<<i<<" q.x: "<<q.x<<" q.step: "<<q.step<<endl; Q.push(q); } } return ; }
总结:学长们说的很对,搜索是万能的!如果题目不要求时间复杂度,不要求内存,理论上任何一个题目都是可以做出来的。hdu上的那题需要更改一下,有兴趣的同学们可以试试!其实这是一道DP水题!!
【杭电的原题链接 1260:Tickets 】http://acm.hdu.edu.cn/showproblem.php?pid=1260
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<string> 6 #include<cstring> // HDU 1260:Tickets 7 using namespace std; 8 int a[2003],b[2003],dp[2003],n; 9 int main() 10 { 11 int i,j,T,k,m; 12 cin>>T; 13 while(T--) 14 { 15 memset(a,0,sizeof(a));memset(b,0,sizeof(b)); 16 memset(dp,0,sizeof(dp)); 17 cin>>n; 18 for(i=1;i<=n;i++) 19 scanf("%d",&a[i]); 20 for(i=1;i<=n-1;i++) 21 scanf("%d",&b[i]); 22 dp[1]=a[1]; 23 for(i=2;i<=n;i++) 24 { 25 dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]); 26 } 27 m=dp[n]; 28 int hh=8,mm=0,ss=0; 29 hh=(hh+m/3600)%24;m=m%3600; 30 mm=m/60; 31 ss=m%60; 32 printf("%02d:%02d:%02d",hh,mm,ss); 33 if(hh<12) 34 printf(" am\n"); 35 else 36 printf(" pm\n"); 37 } 38 39 return 0; 40 }
你懂了吧!傻眼了吧!
以上是关于万能的搜索,用广搜来解决DP问题ZZNU -2046 : 生化危机 / HDU 1260:Tickets的主要内容,如果未能解决你的问题,请参考以下文章