设dp[i][j][k]为矩形(i,j),(n,m)内切割了k次的方案数,然后倒推就行。
class Solution {
public:
int dp[55][55][15];
int sum[55][55]={0};
const int mod=1e9+7;
bool ck(int x1,int y1,int x2,int y2){
return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]>0;
}
int dfs(int x1,int y1,int x2,int y2,int k){
if(k==0)return 1;
if(x1==x2&&y1==y2&&k)return 0;
if(dp[x1][y1][k]!=-1)return dp[x1][y1][k];
long long ans=0;
for(int i=x1+1;i<=x2;i++){
if(ck(x1,y1,i-1,y2)&&ck(i,y1,x2,y2))
ans+=dfs(i,y1,x2,y2,k-1);
ans%=mod;
}
for(int i=y1+1;i<=y2;i++){
if(ck(x1,y1,x2,i-1)&&ck(x1,i,x2,y2))
ans+=dfs(x1,i,x2,y2,k-1);
ans%=mod;
}
return dp[x1][y1][k]=ans;
}
int ways(vector<string>& pz, int k) {
int n=pz.size(),m=pz[0].size();
memset(dp,-1,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sum[i][j]=(pz[i-1][j-1]=='A')+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
}
if(k==1&&ck(1,1,n,m))return 1;
if(k==1)return 0;
return dfs(1,1,n,m,k-1);
}
};
京公网安备 11010502036488号