DP练习1题解C
先上题目描述
需要记录的状态有时间 已经移动次数 当前在那棵树下
很容易想到需要开一个三维数组dp[i][j][k]
i:当前时间 j:已经移动次数 k:当前在那颗树下
因为奶牛移动速度够快(你真的是奶牛吗)
我们可以让奶牛稍微聪明下
他在当前所在树掉果子时 不会傻乎乎跑到另一棵树下(因为吃完再走也来得及)
因此状态转移方式也就是:
在某树掉果子时 奶牛可能从隔壁树跑过来 也可能就在底下等着
然后另外一棵树下的状态等于上一分钟的
方程如下:(以1树掉果子为例)
a[i][j][1]= max(a[i-1][j][1]+1,a[i-1][j-1][2]+1)
a[i][j][2]=a[i-1][j][2];
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int a[1001][31][3];
int d[1001];
int main()
{
int t,w,i,j,max;
while(cin>>t>>w)
{
memset(a,0,sizeof(a));
for (i=1;i<=t;i++)
{
cin>>d[i];
a[i][0][1]=a[i-1][0][1];
a[i][0][2]=0;
a[i][0][d[i]]++;
}
for (i=1;i<=t;i++)
for (j=1;j<=w;j++)
{
if (d[i]==1)
{
max=a[i-1][j][1]+1;
if (a[i-1][j-1][2]+1>max) max=a[i-1][j-1][2]+1;
a[i][j][1]=max;
a[i][j][2]=a[i-1][j][2];
}
else
{
max=a[i-1][j][2]+1;
if (a[i-1][j-1][1]+1>max) max=a[i-1][j-1][1]+1;
a[i][j][2]=max;
a[i][j][1]=a[i-1][j][1];
}
}
max=0;
for (j=0;j<=w;j++)
{
if (a[t][j][1]>max) max=a[t][j][1];
if (a[t][j][2]>max) max=a[t][j][2];
}
cout<<max<<endl;
}
return 0;
}
以上