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];

另外要注意初始化:

View Code
#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;
}
posted on 2012-09-18 23:38  一把刷子  阅读(122)  评论(0编辑  收藏  举报