@离散小波变换°
题目《说明/提示》中说:
1<=x<=300
但是测试点1 2 3 6中均出现x=0的情况
下附1<=x<=300能过但是x=0过不了的代码,即初始时 若(1,1)是?,则一定会消耗次数变为1,(因为(1,1)一定会走到):
#include <bits/stdc++.h>
using namespace std;
int t;
int n,m,x;
char c[505][505];
int dp[505][505][305];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>x;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=0;k<=x;k++)
{
dp[i][j][k]=0;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
}
}
if(c[1][1]=='?')//就是这里
{
c[1][1]='1';
x--;
}
for(int k=0;k<=x;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(c[i][j]=='?'&&k!=0)
{
dp[i][j][k]=max(max(dp[i-1][j][k-1]+1,dp[i][j-1][k-1]+1),max(dp[i-1][j][k],dp[i][j-1][k]));
}
else if(c[i][j]=='?'&&k==0)
{
dp[i][j][k]=max(dp[i-1][j][k],dp[i][j-1][k]);
}
else
{
dp[i][j][k]=(int)(c[i][j]-'0')+max(dp[i-1][j][k],dp[i][j-1][k]);
}
}
}
}
cout<<dp[n][m][x]<<endl;
}
return 0;
}