UVA 1629 - Cake slicing 题解

来源:互联网 发布:淘宝免单可信吗 编辑:程序博客网 时间:2024/06/06 05:14

题意:在一块方形蛋糕上有N个樱桃,只能横,竖切割,切割最小长度使得每一块上蛋糕上有且仅有一个樱桃。

思路:基础动态规划

转移方程:dp[n][m][h][w]=min(dp[n][m][h][t]+dp[n][m+t][h][w-t]+w, dp[n][m][t][w]+dp[n+t][m][h-t][w]+w);

n m 表示矩阵大小, t表示从t出切割,造成的最优解。当然切割后的两块 都要有樱桃 才能切割。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define clr(a,b) memset(a,b,sizeof(a))#define repu(i,a,b) for(int i=a; i<=b; ++i)using namespace std;const int maxn=25;const int INF=1<<29;int n, m, k;int x, y;int kase=0;int g[maxn][maxn];int num[maxn][maxn];int exist[maxn][maxn][maxn][maxn];int dp[maxn][maxn][maxn][maxn];void Clear();int main(){    while(~scanf("%d%d%d", &n, &m, &k)){        Clear();        for(int i =0; i<k;++i){            scanf("%d%d", &x, &y);            g[x][y]=1;        }        repu(i,1,n) repu(j,1,m)        num[i][j]=num[i-1][j]+num[i][j-1]-num[i-1][j-1]+g[i][j];        repu(x,1,n) repu(y,1,m)        repu(h,1,n-x+1) repu(w,1,m-y+1)        exist[x][y][h][w]=num[x+h-1][y+w-1]-num[x+h-1][y-1]-num[x-1][y+w-1]+num[x-1][y-1];        int tmp;        repu(h,1,n) repu(w,1,m)        repu(x,1,n-h+1) repu(y,1,m-w+1){            int &ans=dp[x][y][h][w];            if(exist[x][y][h][w]==0) ans=INF;            else if(exist[x][y][h][w]==1) ans=0;            else {                ans=INF;                repu(t, 1, h-1)                    if(exist[x][y][t][w]>0 && exist[x+t][y][h-t][w]>0){                        tmp=dp[x][y][t][w]+dp[x+t][y][h-t][w]+w;                        if(ans>tmp) ans=tmp;                    }                repu(t, 1, w-1)                    if(exist[x][y][h][t]>0 && exist[x][y+t][h][w-t]>0){                        tmp=dp[x][y][h][t]+dp[x][y+t][h][w-t]+h;                        if(ans>tmp) ans=tmp;                    }            }        }        printf("Case %d: %d\n", ++kase, dp[1][1][n][m]);    }    return 0;}void Clear(){    clr(g, 0);    clr(num, 0);}


0 0
原创粉丝点击