zoukankan      html  css  js  c++  java
  • poj2385(基础DP)

    题目链接:http://poj.org/problem?id=2385

    题意:最开始Bessie站在树1下面,每一个单位时间有颗苹果从树1或者树2上落下来。每个单位时间Bessie可以移动一次位置,时间长度为T(<=1000),Bessie最多移动W次(<=30)。求Bessie最多能得到多少苹果。

    思路:好久没写过dp题了,这道题又弄了好久。QAQ...

       创建dp[1005][35]。

       其中dp[i][j]表示第i个单位时间时,Bessie移动了j次最多能得到的苹果数。首先要初始化i=1的情况:

            if(a[1]==1)
                dp[1][0]=1;
            else
                dp[1][1]=1;

       当i>=2时:

          如果j==0:dp[i][j]=dp[i-1][j]+(a[i]==1)

          否则:dp[i][j]=max(dp[i-1][j],dp[i-1][j-1)

             if(j%2+1==a[i]) ++dp[i][j]。

    代码如下:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    int t,w,ans,a[1005],dp[1005][35];
    
    int main(){
        scanf("%d%d",&t,&w);
        for(int i=1;i<=t;++i)
            scanf("%d",&a[i]);
        if(a[1]==1)
            dp[1][0]=1;
        else
            dp[1][1]=1;
        for(int i=2;i<=t;++i){
            for(int j=0;j<=min(i,w);++j){
                if(j==0)
                    dp[i][j]=dp[i-1][j]+(a[i]==1);
                else{
                    dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
                    if(j%2+1==a[i]) ++dp[i][j];
                }
            }
        }
        for(int i=0;i<=min(t,w);++i)
            if(dp[t][i]>ans)
                ans=dp[t][i];
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    第一章
    第一章 计算机系统漫游
    hihocoder #1014 : Trie树
    第一章
    来个小目标
    poj 1056 IMMEDIATE DECODABILITY
    poj 2001 Shortest Prefixes
    __name__ 指示模块应如何被加载
    Python 常用函数time.strftime()简介
    CentOS安装beEF做XSS平台
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/11180020.html
Copyright © 2011-2022 走看看