zoukankan      html  css  js  c++  java
  • POJ 2385 Apple Catching (dp)

    题意:有两棵树,标号为1和2,在Tmin内,每分钟都会有一个苹果从其中一棵树上落下,问最多移动M次的情况下(该人可瞬间移动),最多能吃到多少苹果。假设该人一开始在标号为1的树下。

    分析:

    1、dp[x][y][z]---第x分钟移动了y次的情况下,现在位于标号为z的树下最多吃到的苹果数。

    2、枚举所有的时间、次数和可能位于的树下。

    若第i分钟该人位于标号为k的树下,第i + 1分钟苹果从标号为a[i+1]的树上落下。

    (1)k==a[i],

    此人站在标号为k的树下不移动,即可再吃到一个苹果:dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);

    此人多方面权衡后选择移动到另一棵树下,则移动但吃不到苹果:dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k]);

    (2)k!=a[i],

    此人移动到另一棵树下,即可再吃到一个苹果:dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k] + 1);

    此人多方面权衡后选择不移动,因此吃不到苹果:dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cctype>
    #include<cmath>
    #include<iostream>
    #include<sstream>
    #include<iterator>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    #include<deque>
    #include<queue>
    #include<list>
    #define lowbit(x) (x & (-x))
    const double eps = 1e-8;
    inline int dcmp(double a, double b){
        if(fabs(a - b) < eps) return 0;
        return a > b ? 1 : -1;
    }
    typedef long long LL;
    typedef unsigned long long ULL;
    const int INT_INF = 0x3f3f3f3f;
    const int INT_M_INF = 0x7f7f7f7f;
    const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
    const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
    const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
    const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
    const int MOD = 1e9 + 7;
    const double pi = acos(-1.0);
    const int MAXN = 1000 + 10;
    const int MAXT = 10000 + 10;
    using namespace std;
    int dp[MAXN][35][3];
    int a[MAXN];
    int Move(int k){
        return k == 1 ? 2 : 1;
    }
    int main(){
        int T, W;
        scanf("%d%d", &T, &W);
        for(int i = 1; i <= T; ++i){
            scanf("%d", &a[i]);
        }
        if(a[1] == 1){
            dp[1][0][1] = 1;
        }
        else{
            dp[1][1][2] = 1;
        }
        for(int i = 1; i <= T - 1; ++i){
            for(int j = 0; j <= W; ++j){
                for(int k = 1; k <= 2; ++k){
                    if(k == a[i + 1]){
                        dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k] + 1);
                        dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k]);
                    }
                    else{
                        dp[i + 1][j + 1][Move(k)] = max(dp[i + 1][j + 1][Move(k)], dp[i][j][k] + 1);
                        dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][k]);
                    }
                }
            }
        }
        int ans = 0;
        for(int i = 0; i <= W; ++i){
            for(int j = 1; j <= 2; ++j){
                ans = max(ans, dp[T][i][j]);
            }
        }
        printf("%d\n", ans);
        return 0;
    }
    

      

  • 相关阅读:
    Assert.isTrue 用法
    P2967 [USACO09DEC]视频游戏的麻烦Video Game Troubles
    最近目标2333
    LibreOJ β Round #2」贪心只能过样例
    CF1062F Upgrading Cities 拓扑排序
    CF1108F MST Unification
    CF915D Almost Acyclic Graph 拓扑排序
    Swift日历控件Calendar
    README.md的markdown语法
    MAC打开App显示已损坏
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/6632914.html
Copyright © 2011-2022 走看看