1 从零开始dp
2 每一个dp的单元 要有逻辑 先根据当前状态处理dp的值 或赋值 或为初始值 再进行转移(这一步正确的前提 是从0开始)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
using namespace std;
int a[1001],t,dp[1001][31],w;
int solve(int i,int j)
{
if(dp[i][j])
return dp[i][j];
if(i>t||j<0)
return 0;
dp[i][j]=0;
if((a[i]==1&&(w-j)%2==0)||(a[i]==2)&&(w-j)%2==1)
{
dp[i][j]=1;
}
dp[i][j] += max(solve(i+1,j),solve(i+1,j-1));
return dp[i][j];
}
int main()
{
memset(dp,0,sizeof(dp));
scanf("%d %d",&t,&w);
for(int i=1;i<=t;++i)
scanf("%d",&a[i]);
printf("%d\n",solve(0,w));
return 0;
}