RT,蒟蒻采用的是简单易懂的三维动态规划。然后第一次采用的是 dp[i][j][0/1], 表示第 i 秒我还能跳j次,0/1表示在哪棵树,然后WA了两个点。
第二次将 j 改为 已经跳了多少次,直接AC,请问大佬们这是什么原因?两种写法除了定义以外应该都是一样的啊
第一种写法
for(int i = 1; i <= T; i++){
for(int j = 0; j <= W; j++){
if(j % 2 == 0) dp[i][j][0] = max(dp[i][j][0], max(dp[i-1][j][0], dp[i-1][j+1][1]) + (a[i] == 1));
else dp[i][j][1] = max(dp[i][j][1], max(dp[i-1][j][1], dp[i-1][j+1][0]) + (a[i] == 2));
}
}
第二种写法:
#include <bits/stdc++.h>
using namespace std;
#define N 1000010
#define ll long long
template <class T>
inline void read(T& a){
T x = 0, s = 1;
char c = getchar();
while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
a = x * s;
return ;
}
int T, W;
int a[N];
int dp[N][50][2];
int main(){
// freopen("hh.txt", "r", stdin);
read(T), read(W);
for(int i = 1; i <= T; i++)
read(a[i]);
for(int i = 1; i <= T; i++){
for(int j = 0; j <= W; j++){
if(!j){
dp[i][j][0] = max(dp[i][j][0], dp[i-1][j][0] + (a[i] == 1));
continue ;
}
if(j % 2 == 0) dp[i][j][0] = max(dp[i][j][0], max(dp[i-1][j][0], dp[i-1][j-1][1]) + (a[i] == 1));
else dp[i][j][1] = max(dp[i][j][1], max(dp[i-1][j][1], dp[i-1][j-1][0]) + (a[i] == 2));
}
}
int ans = -666;
for(int i = 0; i <= W; i++)
ans = max(ans, max(dp[T][i][0], dp[T][i][1]));
cout << ans << endl;
return 0;
}