POJ--2385 Apple Catching(DP)

发布时间 2023-05-26 16:24:46作者: 57one

记录
16:06 2023-5-26

http://poj.org/problem?id=2385

reference:《挑战程序设计竞赛(第2版)》第二章练习题索引 p135

....提交了好几天了,POJ挂了一直没出结果,现在出了才写,都有点忘了。
dp[i][j] 定义为 i为进行移动的次数 到 j 时间可以获得的最大值,dp[i][j] = max(dp[i-1][j-1], dp[i][j-1]) + tree[i % 2][j],这是没有优化的结果

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 1000
#define MAX_M 30
typedef long long ll;
typedef unsigned int uint;
const int INF = 0x3f3f3f3f;

int T, W;
//dp[i][j] 定义为 i为进行移动的次数  到 j 时间可以获得的最大值  
// 0=< i <=W    1=< j <=T
//dp[i][j] = max(dp[i-1][j-1], dp[i][j-1]) + tree[i % 2][j];
int dp[MAX_M][MAX_N + 1]; 
int tree[2][MAX_N + 1];

void solve() {
    int result = -1;
    for(int i = 0; i <= W; i++) {
        for(int j = 1; j <= T; j++) {
            if(i == 0) {
                dp[i][j] = dp[i][j-1] + tree[i % 2][j];
            } else {
                dp[i][j] = max(dp[i][j-1], dp[i-1][j-1]) + tree[i % 2][j];
            }

            if(j == T) {
                if(result < dp[i][T]) {
                    result = dp[i][T];
                }
            }
        }
    }
    printf("%d\n", result);
}

int main() {
    scanf("%d %d", &T, &W);
    int t;
    for(int i = 1; i <= T; i++) {
        scanf("%d", &t);
        tree[(t-1) % 2][i] = 1;
    }
    solve();
}