ZOJ 3741 Eternal Reality 简单dp

来源:互联网 发布:长沙网站整站优化 编辑:程序博客网 时间:2024/05/17 07:52

昨天进行了组队练习赛。在比赛中如果出现思路卡住或者WA题就很容有焦虑不安这种负面情绪涌来,所以自我调节能力和自信显得格外重要,有自信也是在比赛中心理素质的保证,自信源于知识的储备和做过很多题,否则见到一道题就很容易产生一种自己根本做不了的感觉。所以路还长,加油。

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5123

题意:告诉你的等级L,让你去参加N场比赛,只有等级超过该场比赛需要等级才能获胜,给你一颗药,药效是吃后的1~X场比赛中,等级加一,X+1~X+Y场比赛中能力值变成0。X+Y+1场比赛开始可以重新吃药。求最多可以赢多少比赛。

思路:动态规划,dp[i][0]表示1~i场比赛不吃药可以得赢多少场,dp[i][1]表示1~i场比赛中保持药效可以赢多少场,dp[i][2]表示1~i场比赛中等级为零可以获胜多少场。

动态转移方程:dp[i][0]=max(dp[i-1][0]+(lev>=aa[i]),dp[i-a-b][0]+dp[i-b][1]-dp[i-a-b][1]+dp[i][2]-dp[i-b][2])。需要注意的是没有人能达到六级,在我认为的“背景资料”中出现了重要的东西,所以下次一定要认真读整道题然后再做。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cctype>#include <cstdlib>#include <cmath>#include <map>#include <set>#include <queue>#include <stack>#include <vector>#include <ctype.h>#include <algorithm>#include <string>#define PI acos(-1.0)#define maxn 100005#define INF 1<<25#define MAX 0x7fffffff#define mem(a,b) memset(a,b,sizeof(a))#define f(i,a,b) for(i=a;i<b;i++)typedef long long ll;using namespace std;int aa[105];int main(){    int dp[105][3];    int lev,tt,a,b;    while(scanf("%d%d%d%d",&lev,&tt,&a,&b)!=EOF)    {        mem(dp,0);        for(int i=1; i<=tt; i++)        {            scanf("%d",&aa[i]);        }        if(lev==5)        {            dp[1][0]=(lev>=aa[1]);            for(int i=2; i<=tt; i++)            {                dp[i][0]=dp[i-1][0]+(lev>=aa[i]);            }        }        else        {            dp[1][0]=(lev>=aa[1]);            dp[1][1]=(lev+1>=aa[1]);            dp[1][2]=(aa[1]==0);            for(int i=2; i<=tt; i++)            {                dp[i][0]=dp[i-1][0]+(lev>=aa[i]);                dp[i][1]=dp[i-1][1]+(lev+1>=aa[i]);                dp[i][2]=dp[i-1][2]+(aa[i]==0);                if(i>=a+b)                dp[i][0]=max(dp[i-1][0]+(lev>=aa[i]),dp[i-a-b][0]+dp[i-b][1]-dp[i-a-b][1]+dp[i][2]-dp[i-b][2]);            }            for(int i=max(tt-a-b,0); i<=tt; i++)            {                if(tt-i>=a)                    dp[tt][0]=max(dp[tt][0],dp[i][0]+dp[i+a][1]-dp[i][1]+dp[tt][2]-dp[i+a][2]);                else                    dp[tt][0]=max(dp[tt][0],dp[i][0]+dp[tt][1]-dp[i][1]);            }        }        printf("%d\n",dp[tt][0]);    }}


0 0
原创粉丝点击