POJ 2385 DP
竟然自己想出转移方程了 (吃鲸)
(这是水题(尴尬))
题意:
思路:
i表示第i个苹果,选了m-j+1次
初始化
f[i][m+1][0]=f[i-1][m+1][0]+(a[i]==1);
f[i][m+1][0]=f[i-1][m+1][0]+(a[i]==1);
转移
f[i][j][0]=max(f[i-1][j][0],f[i-1][j+1][1])+(a[i]==1);
f[i][j][1]=max(f[i-1][j][1],f[i-1][j+1][0])+(a[i]==2);
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,a[1050],f[1050][35][2];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)f[i][m+1][0]=f[i-1][m+1][0]+(a[i]==1);
for(int i=1;i<=n;i++)f[i][m+1][1]=f[i-1][m+1][1]+(a[i]==2);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
f[i][j][0]=max(f[i-1][j][0],f[i-1][j+1][1])+(a[i]==1);
f[i][j][1]=max(f[i-1][j][1],f[i-1][j+1][0])+(a[i]==2);
}
printf("%d\n",max(f[n][1][1],f[n][1][0]));
}