pojApple Catching(dp)
题目链接:http://poj.org/problem?id=2385
简单说一下我的思路:
建一个dp[i][j]数组,其中 i 表示第 i 秒, j 表示在第 i 秒,第 j 次移动到另一颗树下,
那么在第i秒第j次移动到另一颗树下的最优解就是前一秒由另一棵树下移动到此树下与前一秒就是在这棵树下没有移动之间的最大值,再加上这一秒在此树下所掉落的苹果数量。
由此可得状态转移方程dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + a[i][j%2 + 1];
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #define inf 0x3f3f3f3f 7 using namespace std; 8 const int N = 1005; 9 const int M = 35; 10 11 int dp[N][M], a[N][3]; 12 13 int main() { 14 15 int t, w; 16 cin >> t >> w; 17 for (int i = 1; i <= t; i++) { 18 int ap; 19 cin >> ap; 20 a[i][ap] = 1; 21 } 22 for (int i = 1; i <= t; i++) { 23 for (int j = 2; j <= w + 2; j++) { 24 dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + a[i][j % 2 + 1]; 25 } 26 } 27 cout << dp[t][w + 2] << "\n"; 28 29 return 0; 30 }
永远热爱,永远向着光。

浙公网安备 33010602011771号