poj 2385Apple Catching(简单dp)

 1 /*
 2     题意: 有两棵苹果树,每一棵苹果树每一秒间隔的掉落下来一个苹果,一个人在树下接住苹果,不让苹果掉落!
 3     人在两棵树之间的移动是很快的!但是这个人移动的次数是有限制的,问最多可以接住多少个苹果!
 4
 5     思路:dp[i][j]表示的是前 i个苹果掉落之后, 移动次数是j的情况下的最多接住的苹果的个数!
 6
 7     那么dp[i][j]=max(dp[i-1][j], dp[i][j-1]) + a[i]==j%2+1 ? 1 : 0;
 8
 9     a[i]==j%2+1 表明第j次移动恰好移动到 第 a[i]棵苹果树下,此时这棵苹果树这号掉落下了苹果,正好接住!
10 */
11 #include<iostream>
12 #include<cstring>
13 #include<cstdio>
14 #include<algorithm>
15 #define M 1005
16 using namespace std;
17
18 int dp[M][35];
19
20 int n, m;
21 int a[M];
22
23 int main(){
24    scanf("%d%d", &n, &m);
25    for(int i=1; i<=n; ++i)
26       scanf("%d", &a[i]);
27    if(a[1]==1) dp[1][0]+=1;
28    for(int i=2; i<=n; ++i){
29        dp[i][0]=dp[i-1][0];
30        if(a[i]==1)
31           dp[i][0]+=1;
32    }
33
34    for(int j=1; j<=m; ++j)
35       for(int i=j; i<=n; ++i){
36              dp[i][j]=max(dp[i][j-1], dp[i-1][j]);
37            int cc=j%2+1;
38            if(a[i]==cc)
39               dp[i][j]+=1;
40       }
41    printf("%d\n", dp[n][m]);
42    return 0;
43 } 
时间: 2024-10-02 02:52:09

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

POJ 1260 Pearls 简单dp

1.POJ 1260 2.链接:http://poj.org/problem?id=1260 3.总结:不太懂dp,看了题解 http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122652.html 题意:珍珠,给出需求,单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠. 把握题意,1.输入时,后输入的珍珠价格一定比前面输入的要贵.2.用高质量珍珠替代低质量. #include<iostream> #include

poj 2193 Lenny&#39;s Lucky Lotto Lists 简单dp

//poj 2193 //sep9 #include <iostream> using namespace std; typedef __int64 INT; INT dp[16][2048]; int n,m; int main() { int cases,t=0; scanf("%d",&cases); while(cases--){ scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp));

POJ 3250 Bad Hair Day 简单DP 好题

Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a sp

POJ1088:滑雪(简单dp)

题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一下序,因为只能高度递减才能滑行.之后就很简单了,就是简单DP. 即:要求的滑坡是一条节点递减并依次相邻的最长路径,可以先根据高度将所有的点进行排序,在i点的时候,遍历0~i-1个点(升序排序,i前面的点的高度一定小于等于i),取相邻点间的大的路径长度 代码如下: #include <iostream

POJ 1163 The Triangle DP题解

寻找路径,动态规划法题解. 本题和Leetcode的triangle题目差不多一样的,本题要求的是找到最大路径和. 逆向思维,从底往上查找起就可以了. 因为从上往下可以扩展到很多路径,而从下往上个点的路径是由两条缩减到一条. 这样就可以很简单记录最大路径了. #include <stdio.h> const short MAX_ROW = 101; short triangle[MAX_ROW][MAX_ROW]; short table[MAX_ROW]; short row; inline

poj1163The Triangle(简单DP)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1163 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on

poj1189 简单dp

http://poj.org/problem?id=1189 Description 有一个三角形木板,竖直立放,上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左端和最右端的格子外每个格子都正对着最下面一排钉子的间隙. 让一个直径略小于d的小球中心正对着最上面的钉子在板上自由滚落,小球每碰到一个钉子都可能落向左边或右边(概率各1/2),且球的中心还会正对着下一颗将要碰上的钉子.例如图2就是小球一条可

POJ 1384 Piggy-Bank 背包DP

所谓的完全背包,就是说物品没有限制数量的. 怎么起个这么intimidating(吓人)的名字? 其实和一般01背包没多少区别,不过数量可以无穷大,那么就可以利用一个物品累加到总容量结尾就可以了. 本题要求装满的,故此增加个限制就可以了. #include <stdio.h> #include <stdlib.h> #include <string.h> inline int min(int a, int b) { return a < b? a : b; } c

hdu1207 汉诺塔II 简单dp

本文出自:http://blog.csdn.net/svitter 题意:汉诺塔,多了一根柱子,问你寻找最快的移动次数. dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1; 就是把j个汉诺塔移到一根上dp[ n - j ],然后就是普通的汉诺塔问题,即2^n - 1次移动, 然后把剩下的移动过去dp [ n - j ]. 注意pow(2, j )可能超出long long int范围.写二的次方的时候也可用移位算法. #include <iostream