#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cstdlib> using namespace std; int T, W; //T 時間內 , W : 來回的次數 const int maxn = 1000 + 20; int apple[maxn + 200]; /* dp[i][j]: 給定時刻i, 轉移次數已知爲 j :即上一時刻同一棵樹 或 上一時刻 不一樣的樹 :則這一時刻在轉移次數爲j的狀況下最多能接到的蘋果爲: 那兩個狀態的最大值 + 當前能接受到的蘋果。 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) if (j % 2 + 1 == i ) { dp[i][j]++; } */ int dp[maxn + 20][maxn + 20]; void solve() { scanf("%d%d", &T, &W); for (int i = 1; i <= T; i++) { scanf("%d", &apple[i]); } memset(dp, 0, sizeof(dp)); for (int i = 1; i <= T; i++) { // j 爲 轉移次數 for (int j = 0; j <= W; j++) { if (j == 0) { dp[i][j] = dp[i - 1][j]; } else { //上一時同一棵樹 + 上一時不一樣的樹 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]); } // j:轉移次數,apple[i]:i時刻的樹號 0, 1 // j爲偶數,在第一課樹下時候 || // j爲奇數, 在第二課樹下時候, 只有轉移的時候,而且當前時刻也有蘋果降低,纔去+1 if (j % 2 == apple[i] - 1) { dp[i][j]++; } } } int ans = dp[T][0];
//已知T時刻,各個轉移次數之間進行比較 for (int i = 1; i <= W; i++) { if (ans < dp[T][i]) { ans = dp[T][i]; } } printf("%d\n", ans); } int main() { solve(); return 0; }