Always keep a beginner's mind, don|

Creeper_l

园龄:1年4个月粉丝:10关注:13

【0909 B组】切蛋糕 题解

原题链接:切蛋糕

题意

给定一个 \(n\)\(m\) 列的蛋糕,问横着切 \(i\) 刀,竖着切 \(j\) 刀后美味度最小的蛋糕的美味度尽可能大。一块蛋糕的美味度为它所含有的小块的美味度之和。

数据范围:\(1 \le n,m \le 14\)

思路

看到数据范围,我们可以考虑一种类似于状态压缩的思想,先枚举每一行切的位置的所有情况。对于每一种情况设 \(dp_{i,j}\) 表示枚举到第 \(i\) 列,在列上一共切了 \(j\) 刀时美味度可以达到的最大值。那么可以先预处理处 \(num_{s,L,R}\) 表示在行的状态为 \(s\) 的情况下,在 \(L\) 列和 \(R\) 列分别切一刀时的美味度的最小值。那么则可以推出状态转移方程为:\(dp_{i,j}= \max(dp_{i,j},dp_{k-1,j-1}+num_{i,k})\)。枚举行的情况复杂度 \(O(2^{n})\),预处理和 \(dp\) 转移均为 \(O(n^{3})\),总时间复杂度 \(O(2^{n}n^{3})\),可以通过。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define inf_db
#define ls id << 1
#define rs id << 1 | 1
#define re register
#define endl '\n'
typedef pair <int,int> pii;
const int MAXN = 15;
int n,m,a[MAXN][MAXN],sum[MAXN][MAXN],dp[MAXN][MAXN],ans[MAXN][MAXN],lastp,lastq;
int dis[MAXN][MAXN][MAXN][MAXN],num[MAXN][MAXN];
inline int calc(int x,int y,int p,int q){return sum[x][y] + sum[p - 1][q - 1] - sum[p - 1][y] - sum[x][q - 1];}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(re int i = 1;i <= n;i++)
		for(re int j = 1;j <= m;j++)
		{
			scanf("%lld",&a[i][j]);
			sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
		}
	for(re int i = 1;i <= n;i++) for(re int j = 1;j <= m;j++)
	for(re int p = 1;p <= i;p++) for(re int q = 1;q <= j;q++) dis[i][j][p][q] = calc(i,j,p,q);
	for(re int i = 0;i < (1 << (n - 1));i++)
	{
		for(re int L = 1;L <= m;L++)
			for(re int R = L;R <= m;R++)
			{
				int lastj = 1;num[L][R] = 1e9;
				for(re int j = 1;j <= n;j++)
				{
					if(!(i & (1 << (j - 1))) && (j != n)) continue;
					num[L][R] = min(num[L][R],dis[j][R][lastj][L]);
					lastj = j + 1;
				}
			}
		for(re int j = 0;j <= m;j++) for(re int k = 0;k <= m;k++) dp[j][k] = -1e9;
		dp[0][0] = 1e9;
		for(re int j = 1;j <= m;j++) for(re int k = 1;k <= j;k++)
		for(re int p = 1;p <= j;p++) dp[j][p] = max(dp[j][p],min(dp[k - 1][p - 1],num[k][j]));
		int id = __builtin_popcount(i) + 1;
		for(re int k = 1;k <= m;k++) ans[id][k] = max(ans[id][k],dp[m][k]);
	} 
	for(re int i = 1;i <= n;i++) 
	{
		for(re int j = 1;j <= m;j++) printf("%lld ",ans[i][j]);
		puts("");
	}	
	return 0;
}

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/17913433.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
半生雪 - 七叔-叶泽浩
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起