cathing apples

有两棵APP树,编号为1,2.每一秒,这两棵APP树中的其中一棵会掉一个APP.每一秒,你可以选择在当前APP树下接APP,或者迅速移动到另外一棵APP树下接APP(移动时间可以忽略不计),但由于却乏锻炼,你最多移动W次.问在T秒内,你最多能收集多少个APP.假设你开始站在1号APP树下.

Input

第1行:两个整数T(1 < = T< = 1000)和W(1 < = W< = 30)
第2..T+1行:1或2,代表每分钟掉落APP的那棵树的编号

Output

一行一个整数,代表你移动不超过W次能接住的最大APP数

Sample Input

7 2
2
1
1
2
2
1
1
output
6
还是太菜了,这题最后我看了题解,关键是要想到转移奇数次在2树下,转移奇数次在1树下,而至于他们选不选,是由编号与转移的次数共同决定的。
#include <iostream>
#include <algorithm>
#include <cstdio>
int a[1003];
int dp[1002][44];
using namespace std;
int main()
{
    int t,w;
    cin>>t>>w;
    for(int i=1;i<=t;i++)
    {
        scanf("%d",&a[i]);
        a[i]--;
    }
    for(int i=1;i<=t;i++)
    {
        for(int j=0;j<=w;j++)
        {
            if(j%2!=0)
            {
                dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i];
            }
            else
            {
                if(j)
                {
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+!a[i];
                }
                else
                dp[i][j]=dp[i-1][j]+!a[i];
            }
        }
    }
    cout<<dp[t][w]<<endl;
}

 

posted @ 2019-07-11 23:44  coolwx  阅读(170)  评论(0编辑  收藏  举报