uva 1629 Cake Slcing 记忆化搜索+dp

来源:互联网 发布:什么是阿里云证书 编辑:程序博客网 时间:2024/06/06 19:15

点击打开链接

//题意:n*m的矩形上有k个cake 问最少切多少次能把这k个cake分离开来(不在同一个矩形上) 
idp[N][N][N][N]; N<=20
//dp[u][d][l][r] 定义上下左右边界为u,d,l,r时,最小的切割次数 按水平和垂直切割转移状态即可

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <map>#include <vector> using namespace std;typedef long long ll;const int N=20+5;const ll inf=1e9;int n,m,k;bool a[N][N];//该pos是否有cake //题意:n*m的矩形上有k个cake 问最少切多少次能把这k个cake分离开来(不在同一个矩形上) int dp[N][N][N][N];//dp[u][d][l][r] 定义上下左右边界为u,d,l,r时,最小的切割次数 int sum(int u,int d,int l,int r){int res=0;for(int i=u+1;i<=d;i++)// {for(int j=l+1;j<=r;j++){if(a[i][j])res++;}}return res;}int DP(int u,int d,int l,int r){int &res=dp[u][d][l][r];if(res!=-1)return res;int tot=sum(u,d,l,r);//计算该区域内有多少个cake if(tot==1)return res=0; if(tot==0)//每一块都要有且只有一个cake return res=inf;res=inf;//水平切割 for(int i=u+1;i<d;i++){res=min(res,DP(u,i,l,r)+DP(i,d,l,r)+r-l);//切割长度r-l} for(int j=l+1;j<r;j++){res=min(res,DP(u,d,l,j)+DP(u,d,j,r)+d-u);}return res;}int main(){int cas=0;while(cin>>n>>m>>k){memset(a,0,sizeof(a));memset(dp,-1,sizeof(dp));for(int i=0;i<k;i++){int x,y;cin>>x>>y;a[x][y]=1;}int ans=DP(0,n,0,m);printf("Case %d: %d\n",++cas,ans);}return 0;}


0 0
原创粉丝点击