http://poj.org/problem?id=2385
和天上掉馅饼那个差不多。
dp[i][j]表示第i分钟移动了j步。
一开始直奔馅饼的那个想法,所以就需要三唯的: i 第几分钟 ,j 哪个位置 ,k 移动了几步
但是本题 只要两个位置 ,所以可以用k来表示了j
所以就有了状态转移方程:
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+t[i][(j+1)%2];
另外要注意初始化:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> using namespace std; int dp[2000][40]; int t[2000][2]; int main() { int n,m; while(cin>>n>>m) { memset(t,0,sizeof(t)); for(int i=1;i<=n;i++) { int temp; cin>>temp; t[i][temp%2]=1; dp[i][0]=dp[i-1][0]+temp%2;//开始初始化没注意 wa了 } for(int j=1;j<=m;j++) { for(int i=1;i<=n;i++) { dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+t[i][(j+1)%2];//状态方程 } } cout<<dp[n][m]<<endl; } return 0; }