P4158 [SCOI2009]粉刷匠(dp)
一个比较好的性质:不可能存在不刷的情况,刷上就有可能对,所以得到递推式
#include<cstdio>
#include<iostream>
using namespace std;
int a[55][55];
int dp[55][55][2501][2],n,ans,m,t;
int main(){
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++){
char c[55];
scanf("%s",c+1);
for(int j=1;j<=m;j++){
a[i][j]=c[j]-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=t;k++){
if(j==1){
dp[i][j][k][0]=max(dp[i-1][m][k-1][1],dp[i-1][m][k-1][0]);
dp[i][j][k][1]=max(dp[i-1][m][k-1][1],dp[i-1][m][k-1][0])+1;
}
else
if(a[i][j]!=a[i][j-1]){
dp[i][j][k][0]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0]);
dp[i][j][k][1]=max(dp[i][j-1][k][0],dp[i][j-1][k-1][1])+1;
}
else{
dp[i][j][k][0]=max(dp[i][j-1][k][0],dp[i][j-1][k-1][1]);
dp[i][j][k][1]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0])+1;
}
}
}
}
ans=max(dp[n][m][t][0],dp[n][m][t][1]);
printf("%d",ans);
return 0;
}