UVA1629 切蛋糕 Cake slicing

UVA1629 切蛋糕 Cake slicing

题目描述

有一个 \(n\)\(m\) 列(\(1 \leq n, m \leq 20\))的网络蛋糕上有 \(k\) 个樱桃。每次可以用一刀沿着网络线把蛋糕切成两块,并且只能够直切不能拐弯。要求最后每一块蛋糕上恰好有一个樱桃,且切割线总长度最小。求出这个最小总长度。

输入格式

有多组测试数据。

对于每组数据,第一行三个整数 \(n,m,k\)

接下来 \(k\) 行每行两个整数 \(x_i,y_i\) 描述第 \(i\) 个樱桃所在位置。

输出格式

对于每组数据,输出一行 Case x: y,其中 \(x\) 表示当前是第 \(x\) 组测试数据,\(y\) 表示答案即切割线最小总长度。

输入输出样例 #1

输入 #1

3 4 3
1 2
2 3
3 2

输出 #1

Case 1: 5

思路

数据范围、题面的“最”,可以感觉出来大概率是一道dp。

再来尝试设计状态,因为这里对于切割次数没有限制,也没有其他限制,那么就并没有这种关键变量,所以说只能看网格上面的一部分切几次,而且这道题肯定是从小方格到大方格来推。

那么要定位这一个区域,自然需要左上右下两个点来确定,那么直接设 \(f_{i,j,x,y}\) 表示 左上 \((i,j)\) , 右下 \((x,y)\) 这个矩形最少需要的切割次数,而且面积比它小的所有矩形的答案都求出来了,那么现在肯定就可以切一刀把它变成两个子矩形,然后直接合并答案就可以了,那么转移方程式也就出来了,至于具体的坐标就自己画图,很快就看得出来:

\[f_{i,j,x,y}=\min\{f_{i,j,x,k}+f_{i,k+1,x,y}+(x-i+1),f_{i,j,p,y}+f_{p+1,j,x,y}+(y-j+1)\} \]

然后判断是否合法,也就是可以直接不用dp,直接跳过要用一个二维前缀和。

还有就是要注意每一块蛋糕上面必须要有樱桃,不能是空白的。

code

#include <bits/stdc++.h>
using namespace std;
const int N=21;
int mp[N][N],sum[N][N];
int f[N][N][N][N];
int n,m,k,caseId;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	while(cin>>n>>m>>k){
		memset(sum,0,sizeof(sum));
		memset(mp,0,sizeof(mp));
		memset(f,0x3f,sizeof(f));
		for(int i=1;i<=k;i++){
			int x,y;
			cin>>x>>y;
			mp[x][y]=1;
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mp[i][j];
			}
		}
		
		for(int len1=1;len1<=n;len1++){
			for(int len2=1;len2<=m;len2++){
				for(int i=1;i+len1-1<=n;i++){
					for(int j=1;j+len2-1<=m;j++){
						int x=i+len1-1;
						int y=j+len2-1;
						if(sum[x][y]-sum[x][j-1]-sum[i-1][y]+sum[i-1][j-1]==1){
							f[i][j][x][y]=0;
							continue;
						}
						for(int k=j;k<y;k++){
							f[i][j][x][y]=min(f[i][j][x][y],f[i][j][x][k]+f[i][k+1][x][y]+len1);
						}
						for(int k=i;k<x;k++){
							f[i][j][x][y]=min(f[i][j][x][y],f[i][j][k][y]+f[k+1][j][x][y]+len2);
						}
					}
				}
			}
		}
		caseId++;
		cout<<"Case "<<caseId<<": "<<f[1][1][n][m]<<'\n';
		//cout<<f[1][1][n][m]<<'\n';
	}
	return 0;
}
posted @ 2025-07-29 16:26  shencheng4014  阅读(11)  评论(0)    收藏  举报