一开始超内存超麻了,最后发现动态分配一下内存就可以了的o( ̄┰ ̄*)ゞ
很明显是一道dp问题,最近才开始学背包,我就看成01背包来理解了,每个'?'就是一个价值为1,空间大小为1的物品,而'1','0'就是无体积价值分别为1,0的物品。既然是dp,呢就给推出状态转移方程,我们由繁入简
这样肯定会爆内存,所以就要用滚动数组来优化成二维,如果我们正序来进行迭代,呢么就需要两个二维数组,一个存放当前这一层的的数据,另一个用于存放上一层的,但如果我们倒序进行,只用一个数组就可以解决问题,原因是因为倒序进行时不会破坏该位置前的数,也就是这个位置前的数都还没有进行更新,处于上一层,所以就可以作为上一层的数据来对当前层进进行更新。
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
#include<cmath>
#include<queue>
using namespace std;
int t;
int n,m ,x;
int main(){
cin >> t ;
while(t--){
cin>>n>>m>>x;
char g[n+1][m+1];
int dp[m+1][x+1];
int res = -1;
for(int i =1;i <= n ; i ++)
for(int j = 1;j <= m ; j ++)
cin>>g[i][j];
for(int i =1;i <= n ; i ++){
for(int j = 1;j <= m ; j ++){
for(int l = x ; l >=0 ; l --){
if(g[i][j] == '0'){
dp[j][l] = max(dp[j-1][l] ,dp[j][l]);
}
else if(g[i][j] == '1'){
dp[j][l] = max(dp[j-1][l] ,dp[j][l]) + 1 ;
}
else{
dp[j][l] = max(dp[j - 1][l], dp[j][l]);
if (l >= 1) {
int te = dp[j][l] = max(dp[j-1][l-1]+1,dp[j][l-1]+1);
dp[j][l] = (dp[j][l],te);
}
}
}
}
}
cout<<dp[m][x]<<endl;
}
return 0;
}