DP,得到最多苹果,(POJ2385)

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

题意:

  牛在两棵苹果树下收集苹果,牛只能在这两棵树之间走动w次,在t时刻,某棵树会掉下苹果。

解题报告:

///dp[t][w]表示1~t秒内,转w次能够获得的最多苹果数目
///状态转移方程 dp[t][w]=max(dp[t-1][w],dp[t-1][w-1])

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

int main()
{
    int a[1010];  ///a[i]时刻时,苹果落地的位置
    int dp[1010][35];

    int t,w;
    scanf("%d%d",&t,&w);
    for(int i=1;i<=t;i++)
        scanf("%d",&a[i]);

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

    for(int i=2;i<=t;i++)
    {
        for(int j=0;j<=w;j++)
        {
            if(j==0){
                dp[i][j]=dp[i-1][j]+a[i]%2;
                continue;
            }
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]);
            if(j%2+1==a[i])
                dp[i][j]++;
        }
    }

    int ans=0;
    for(int i=0;i<=w;i++)
        ans=max(ans,dp[t][i]);

    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-25 07:46:01

DP,得到最多苹果,(POJ2385)的相关文章

【DP】捡苹果

#include<stdio.h> int max(int a,int b) { int c; if(a>b) c=a; else c=b; return c; } int main() { FILE *fin,*fout; int a[8][8],i,j; fin=fopen("in.txt","r"); fout=fopen("out.txt","w"); for(i=0;i<=5;i++) for

BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )

dp dp( x , k ) = max( dp( x - 1 , k - 1 ) + *** , dp( x - 1 , k ) + *** ) *** = 0 or 1 ,根据情况 (BZOJ 1750双倍经验) ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm>

POJ2385 Apple Catching 【DP】

Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8018   Accepted: 3922 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, eac

去地里收苹果!

题目描述: 在n*m的一块苹果田中,没一单位面积都有若干苹果,从(1,1)坐标开始采集,每次只能向下或向右移动,请问采集的最多苹果个数? :) for example: 3 3 1 2 3 6 8 9 1 1 1 很明显答案是:25 . 先向下1步,然后向右2步,再向下1步. 思路: 代码中dp数组,用来存储当前状态最大值,apple数组用来存储对应地点的苹果数目. 这题要用动态规划,求采集苹果最多个数,其实就是求走到(n,m)坐标时最多个数. 分成一个个子问题,对于当前坐标(i,j),只可能是

dp新手入门

网址转载链接:  http://bbs.chinaunix.net/thread-4094539-1-1.html 动态规划:从新手到专家 Hawstein翻译 前言 我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解. 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题. 这篇文章是基于实例展开来讲的,因为干巴巴的理论实在不好理解. 注意:如果你对于其中某一节已经了解并且不想阅读它,没关系,直接跳过它即可. 简介(入门) 什么是动态规划,我们要如何描述它?

刷题总结——二叉苹果树(ssoj树形dp+记忆化搜索)

题目: 题目背景 URAL:http://acm.timus.ru/problem.aspx?space=1&num=1018 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说没有只有 1 个儿子的结点,这棵树共有N 个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置.下面是一颗有 4 个树枝的树:         2    5          \ /              3    4         

Ural 1018 binary apple tree(显性树的树dp)

题意:一棵含n个节点的树,保留m条边,使含m条边的子树的边权和最大: 思路:树dp.求含m+1个节点边权和最大的子树.对每个分支节点有三种操作:剪去左子树:剪去右子树:将其节点数合理分配给左右子树: 记以x为根,含k个节点的子树的最大边权和为g[x][k]. 若x为叶节点,则g[x][k]为x通往父节点的边权:若非叶节点,枚举k-1个节点分配在左右子树的所有可能方案,找到最佳方案: #include<cstdio> #include<cstring> #include<alg

Apple Catching(dp)

Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9831   Accepted: 4779 Description It is a little known fact that cows love apples. Farmer John has two apple trees (which are conveniently numbered 1 and 2) in his field, eac

Ural 1018 (树形DP+背包+优化)

题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给定留下m根树枝,问最后剩下的最多苹果是多少. 解题思路: 其实意思和Vijos 1180(选课)的意思差不多.只不过权在边而已. 首先建无向图dfs. for(f+1...j....cost) for(1....k...j-cost) 其中f为当前已经dfs子结点个数.之所以+1,是因为当前点也需要