Leetcode 1444. 切披萨的方案数(DP,类似石材切割,二维前缀和)
给你一个 rows x cols 大小的矩形披萨和一个整数 k ,矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子)。你需要切披萨 k-1 次,得到 k 块披萨并送给别人。
切披萨的每一刀,先要选择是向垂直还是水平方向切,再在矩形的边界上选一个切的位置,将披萨一分为二。如果垂直地切披萨,那么需要把左边的部分送给一个人,如果水平地切,那么需要把上面的部分送给一个人。在切完最后一刀后,需要把剩下来的一块送给最后一个人。
请你返回确保每一块披萨包含 至少 一个苹果的切披萨方案数。由于答案可能是个很大的数字,请你返回它对 10^9 + 7 取余的结果。
示例 1:
输入:pizza = ["A..","AAA","..."], k = 3 输出:3 解释:上图展示了三种切披萨的方案。注意每一块披萨都至少包含一个苹果。 示例 2:
输入:pizza = ["A..","AA.","..."], k = 3 输出:1 示例 3:
输入:pizza = ["A..","A..","..."], k = 1 输出:1
提示:
1 <= rows, cols <= 50 rows == pizza.length cols == pizza[i].length 1 <= k <= 10 pizza 只包含字符 'A' 和 '.' 。
思路:首先二维前缀和预处理出特定二维区域的含披萨个数,nums[i][j]表示左上角坐标是i,j到n-1,m-1区域所包含的披萨数
接着考虑dp[i][j][k]:表示左上角坐标是i,j到n-1,m-1区域切成k块的方案数,要么横着切,要么竖着切,
先预处理dp[i][j][1]只要区域里面有披萨就ok
单说一种情况就好:
横着切就是切i+1行之后的,暴力枚举q,只要判断nums[i][j]-nums[q][j]>=1即可,q>i,q<n加上这种方案就好,
class Solution {
public:
const int mod=1e9+7;
int ways(vector<string>& pizza, int k) {
int n=pizza.size(),m=pizza[0].size();
int nums[55][55]={0};
for(int i=n-1;i>=0;i--)
{
for(int j=m-1;j>=0;j--)
{
nums[i][j]+=nums[i+1][j]+nums[i][j+1]-nums[i+1][j+1]+(pizza[i][j]=='A');
}
}//前缀和初始化
int dp[55][55][15]={0};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(nums[i][j])dp[i][j][1]=1;
}
}
for(int i=n-1;i>=0;i--)
{
for(int j=m-1;j>=0;j--)
{
for(int h=2;h<=k;h++)
{
for(int q=i+1;q<n;q++)
{
if(nums[i][j]-nums[q][j]>=1)
{
dp[i][j][h]+=dp[q][j][h-1];
dp[i][j][h]%=mod;
}
}
for(int q=j+1;q<m;q++)
{
if(nums[i][j]-nums[i][q]>=1)
{
dp[i][j][h]+=dp[i][q][h-1];
dp[i][j][h]%=mod;
}
}
//cout<<dp[i][j][h]<<" ";
}
//cout<<endl;
}
}
return dp[0][0][k];
}
};
- 我所理解的 PHP Trait
- 算法 | 数据结构常见的八大排序算法
- 高通量数据下载还能这样操作?
- ofbiz实体引擎(八) 创建表
- ofbiz实体引擎(七) 检查数据源
- ofbiz实体引擎(六) GenericHelper的初始化创建
- ofbiz实体引擎(五) ModelGroupReader
- HBitcoin:C#高级比特币钱包库 - 保护您的财产安全
- ofbiz实体引擎(四) ModelReader的作用
- ofbiz实体引擎(三) GenericDelegator实例化的具体过程
- 机器学习实战 | 第五章:模型保存(持久化)
- Python编程任务 | 斯坦福CS231n-深度学习与计算机视觉课程
- ofbiz实体引擎(二) delegator实例化具体方式
- ofbiz实体引擎(一) 获取Delegator
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法