您的位置:首页 > 其它

Uva 1629 切蛋糕

2017-01-01 11:05 381 查看
题目链接:https://vjudge.net/contest/146179#problem/B

题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃~问最少切割距离是?

分析:可以根据每次的切割范围遍历找最优值,也就是说状态描述d[u][d][l][r] 是这个范围内的最短距离。要是这个范围内只有一个樱桃,那么就是 0 ,要是没有樱桃就是无穷大。

#include <bits/stdc++.h>

using namespace std;

const int INF = 0x3f3f3f3f;

bool maps[25][25];
int r,c,cnt;

int dps[25][25][25][25];

int sum(int u,int d,int l,int r)
{
int sums = 0;
for(int i=u; i<=d; i++)
for(int j=l; j<=r; j++)
if(maps[i][j])
sums++;
return sums;
}

int dp(int u,int d,int l,int r)
{
int &ans = dps[u][d][l][r];
if(ans!=-1)
return ans;
else if(sum(u,d,l,r)==1)
return ans=0;
else if(sum(u,d,l,r)==0)
return ans=INF;
else
{
ans = INF;
for(int i=u; i<=d; i++)
ans = min(ans,dp(u,i,l,r)+dp(i+1,d,l,r)+r-l+1);
for(int i=l; i<=r; i++)
ans = min(ans,dp(u,d,l,i)+dp(u,d,i+1,r)+d-u+1);
}
return ans;
}

int main()
{
int kase = 1;
while(scanf("%d%d%d",&r,&c,&cnt)!=EOF)
{
memset(dps,-1,sizeof(dps));
memset(maps,0,sizeof(maps));

for(int i=0; i<cnt; i++)
{
int rx,ry;
scanf("%d%d",&rx,&ry);
maps[rx][ry] = 1;
}

printf("Case %d: %d\n",kase++,dp(1,r,1,c));
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: