poj2385 Apple Catching(dp状态转移方程推导)
Posted Surprisez
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2385 Apple Catching(dp状态转移方程推导)相关的知识,希望对你有一定的参考价值。
https://vjudge.net/problem/POJ-2385
猛刷简单dp的第一天的第一题。
状态:dp[i][j]表示第i秒移动j次所得的最大苹果数。关键要想到移动j次,根据j的奇偶判断人在哪里。
想了挺久的,最后还是参考了一篇和自己思路最近的代码https://blog.csdn.net/hellohelloc/article/details/52050207
我比他缺少的是特判dp[i][0]的状态,后面的一切都以此为基础的。
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #include<set> 8 #define INF 0x3f3f3f3f 9 typedef long long ll; 10 using namespace std; 11 int a[1010], dp[1010][1010]; 12 int main() 13 { 14 memset(dp, 0, sizeof(dp)); 15 int n, m; 16 cin >> n >> m; 17 for(int i = 1; i <= n; i++){ 18 cin >> a[i]; 19 } 20 for(int i = 1; i <= n; i++){ 21 dp[i][0] = dp[i-1][0]; 22 if(a[i] == 1){//苹果在左边 23 dp[i][0]++; 24 for(int j = 1; j <= m; j++){ 25 if(j&1)//人在右边 26 dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]); 27 else//人在左边 28 dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])+1; 29 } 30 } 31 else{//苹果在右边 32 for(int j = 1; j <= m; j++){ 33 if(j&1)//人在右边 34 dp[i][j] = max(dp[i-1][j], dp[i-1][j-1])+1; 35 else//人在左边 36 dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]); 37 } 38 } 39 } 40 int maxm = -INF; 41 for(int i = 0; i <= m; i++){ 42 maxm = max(maxm, dp[n][i]); 43 } 44 cout << maxm << endl; 45 return 0; 46 }
以上是关于poj2385 Apple Catching(dp状态转移方程推导)的主要内容,如果未能解决你的问题,请参考以下文章
poj2385 Apple Catching(dp状态转移方程推导)