码迷,mamicode.com
首页 > 其他好文 > 详细

hdu-3008魔兽争霸

时间:2015-08-06 22:22:37      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:动态规划

这道题目相当有意思,打魔兽对于很多人来说并不陌生,人和boss的hp都是100,人首先攻击,人的普攻为1,有木有这么弱!还好技能是自己输入,不然真的没话说。
好啦,这题就是用动态规划解题,主要还是看状态方程,状态方程不唯一,你可以设f[i][j]表示第i次攻击是剩余蓝量j所造成的最大伤害,也可设第i次攻击所造成的伤害j所消耗的蓝量,反正这道题状态方程不唯一,这是我用第一种状态方程写的,变量有点多,但是找到关键,其实都是浮云。状态方程:f[i][j-a[k]+t]=max(f[i][j-a[k]+t],f[i-1][j]+b[k]);

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[101][101];
int main()
{
    int n,t,q;
    int a[101],b[101];
    int time;
    while(cin>>n>>t>>q&&(n+t+q))
    {

        memset(f,-1,sizeof(f));//初始化为-1
        for(int i=1; i<=n; i++)
        {
            cin>>a[i]>>b[i];
        }
        f[0][100]=0;
        a[0]=0;
        b[0]=1;
        time=100/q;//表示人最多经过几回合
        if(100%q!=0)
            time++;
        int ans=-1;
        for(int i=1; i<=time; i++)
        {
            for(int j=0; j<=100; j++)//表示剩余蓝量

                if(f[i-1][j]!=-1)
                {
                    for(int k=0; k<=n; k++)//使用技能
                    {
                        if(j>=a[k])//当前蓝量可支持a[k]技能的释放,进入循环
                        {
                            f[i][j-a[k]+t]=max( f[i][j-a[k]+t],f[i-1][j]+b[k]);//状态方程
                              if( f[i][j-a[k]+t]>=100)//所造成伤害超过100,记录是第几回合
                        {
                            ans=i;
                            break;
                        }

                        }
                         if(ans!=-1)
                            break;
                    }

                }
            if(ans!=-1)
                break;
        }
        if(ans==-1)
            cout<<"My god"<<endl;
        else
            cout<<ans<<endl;
    }
    return 0;
}







版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu-3008魔兽争霸

标签:动态规划

原文地址:http://blog.csdn.net/bestcoder_judge/article/details/47323421

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!