首页 > 代码库 > 【万能的搜索,用广搜来解决DP问题】ZZNU -2046 : 生化危机 / HDU 1260:Tickets

【万能的搜索,用广搜来解决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