0pts球条,玄2关,拜谢,橙题,简单DP
查看原帖
0pts球条,玄2关,拜谢,橙题,简单DP
737219
YONEX楼主2024/11/18 15:01

RT,拜谢

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
inline ll read() 
{ 
  char c=getchar();ll x=0,f=1;
  while(c<'0' or c>'9'){if(c=='-')f=-1;c=getchar();} 
  while(c>='0' and c<='9'){x=x*10+c-'0';c=getchar();} 
  return x*f;
} 
int m,n,k,p;
char a[505][505];
int dp[305][505][505];
int main() 
{  
  p=read(); 
  for(int i=1;i<=p;i++)  
  {  
  	m=read();n=read();k=read(); 
  	for(int j=1;j<=m;j++)for(int l=1;l<=n;l++)cin>>a[j][l];  
  	dp[0][0][0]=0;
  	for(int u=0;u<=k;u++) 
  	{
  		for(int j=1;j<=m;j++)  
  		{  
  			for(int l=1;l<=n;l++)   
  			{    
  				if(a[j][l]=='0')dp[u][j][l]=max(dp[u][j-1][l],dp[u][j][l-1]);
  				if(a[j][l]=='1')dp[u][j][l]=1+max(dp[u][j-1][l],dp[u][j][l-1]); 
  				if(a[j][l]=='?' and u>=1) 
  				{ 
  					dp[u][j][l]=max(1+max(dp[u-1][j-1][l],dp[u-1][j][l-1]),max(dp[u][j-1][l],dp[u][j][l-1]));
//						else dp[u][j][l]=max(dp[u][j-1][l],dp[u][j][l-1]);
  				}   
  			}  
  		} 
  	}
//			for(int j=1;j<=m;j++)  
//			{  
//				for(int l=1;l<=n;l++)
//				{
//					cout<<dp[k][j][l]<< " ";
//				}
//				cout<<endl;
//			}
  	int ans=0;
  	for(int j=0;j<=k;j++)ans=max(ans,dp[j][m][n]);
  	printf("%d\n",ans);
  }   
  return 0;  
}
2024/11/18 15:01
加载中...