poj 2385Apple Catching(简单dp)

/*
    题意: 有两棵苹果树,每一棵苹果树每一秒间隔的掉落下来一个苹果,一个人在树下接住苹果,不让苹果掉落!
    人在两棵树之间的移动是很快的!但是这个人移动的次数是有限制的,问最多可以接住多少个苹果!

    思路:dp[i][j]表示的是前 i个苹果掉落之后, 移动次数是j的情况下的最多接住的苹果的个数!

    那么dp[i][j]=max(dp[i-1][j], dp[i][j-1]) + a[i]==j%2+1 ? 1 : 0;

    a[i]==j%2+1 表明第j次移动恰好移动到 第 a[i]棵苹果树下,此时这棵苹果树这号掉落下了苹果,正好接住!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define M 1005
using namespace std;

int dp[M][35];

int n, m;
int a[M];

int main(){
   scanf("%d%d", &n, &m);
   for(int i=1; i<=n; ++i)
      scanf("%d", &a[i]);
   if(a[1]==1) dp[1][0]+=1;
   for(int i=2; i<=n; ++i){
       dp[i][0]=dp[i-1][0];
       if(a[i]==1)
          dp[i][0]+=1;
   }

   for(int j=1; j<=m; ++j)
      for(int i=j; i<=n; ++i){
             dp[i][j]=max(dp[i][j-1], dp[i-1][j]);
           int cc=j%2+1;
           if(a[i]==cc)
              dp[i][j]+=1;
      }
   printf("%d\n", dp[n][m]);
   return 0;
}
时间: 2024-10-01 19:25:02

poj 2385Apple Catching(简单dp)的相关文章

poj 1192 最优联通子集 简单dp

    看起来和图相关,其实就是个简单dp,就和取最大连续和一样,只是在一颗树中取--     有人说是树状dp,我也不知道是不是 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib&g

POJ 3176 Cow Bowling:简单DP

Cow Bowling http://poj.org/problem?id=3176 Time Limit: 1000MS Memory Limit: 65536K Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though, and line up in a standard bowling-pin-l

HDOJ/HDU 1029 Ignatius and the Princess IV(简单DP,排序)

此题无法用JavaAC,不相信的可以去HD1029题试下! Problem Description "OK, you are not too bad, em- But you can never pass the next test." feng5166 says. "I will tell you an odd number N, and then N integers. There will be a special integer among them, you hav

hdu2084 数塔【简单DP】

数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17241 Accepted Submission(s): 10340 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉

UVA 10405 Longest Common Subsequence:简单DP

省赛还有不到50天了,自己DP这块实在是弱,准备就拿着些天狂刷DP了. http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1346 大意: 求两个字符串的最长公共子序列. 思路:水题,不过需要注意的就是字符串里可能会出现空格,需要用gets,真是坑. 更多精彩内容:http://www.bianceng.cnhttp://www.biancen

算法:poj 2392 Space Elevator(dp 排序+多重背包)

题目大意: 有n种砖头,每种砖头的高为h,数量为c, 且它放的最高位置不能超过a. 问这些砖 最高能够叠多高? 思路: 先把所有种类砖头按照a从大到小排序,然后直接套多重背包即可 . 代码: #include<iostream> #include<queue> #include<stack> #include<cstdio> #include<cstring> #include<cmath> #include<map> #

算法:poj 1948 Triangular Pastures (dp 二维01背包)

题目大意: 给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上. 思路: 对于已知周长的三角形,我们只要知道两条边的长度变可推出第三条边,所以可以得 到状态方程: f[i][j][k] 表示用前i条边,能否组成长度为j和k的两条边 初始化f[0][0][0] = true: f[i][j][k] = f[i-1][j-len[i]][k] || f[i-1][j][k-len[i]]; 如果f[i][j][k]=true ,那么就计算以j,k,sum-j-k为三条边能否组成三

算法:poj 1837 Balance (dp 01背包)

题目大意: 有一个天平,天平左右两边的手臂长度都是15,手臂上面有些位置会有挂钩.还有G 个砝码 (1 <= G <= 20),它们重量各不相同,在1~25中取值. 给出C个挂钩,它们的位置在 [-15..15],不会重叠.负号的代表在左边臂,正号的在右边. 要求把所有砝码都放在挂钩上,多 个砝码可以挂在同一个挂钩上,问有多少种不同的方案使天平能够平衡? 思路: 天平左臂 的力矩和是负数,右边的力矩和是正数,那么左边+右边的力矩之和,如果是正数,代表天平平衡倾向右边 ,负数代表倾向左边,为0的

关于最长上升子序列的算法 简单dp

 nefu 21题 description 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N.比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等.这些子序列中最长的