[DP枚举]UVa 1629 - Cake slicing

来源:互联网 发布:数据加密的基本功能 编辑:程序博客网 时间:2024/05/18 09:49

左右切 上下切

枚举处每一种切法 在求最小的

用到了记忆化DP

#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;int n,m,dp[25][25][25][25];bool has[25][25];int sum(int u,int d,int l,int r){    int ret=0;    for(int i=u+1;i<=d;i++)        for(int j=1+l;j<=r;++j)    {        if(has[i][j]) ++ret;        if(ret==2) return ret;    }    return ret;}int dfs(int u,int d,int l,int r){    int &ret=dp[u][d][l][r];    if(ret!=-1) return ret;    int total=sum(u,d,l,r);    if(total==1) return ret=0;    if(!total)return ret=INF;    ret=INF;    for(int i=u+1;i<d;i++){        ret = min(ret,dfs(u,i,l,r)+dfs(i,d,l,r)+r-l);    }    for(int i=l+1;i<r;++i)        ret=min(ret,dfs(u,d,l,i)+dfs(u,d,i,r)+d-u);    return ret;}int main(){    int k,x,y,kase=0;    while(cin>>n>>m>>k)    {        memset(dp,-1,sizeof(dp));        memset(has,0,sizeof(has));        for(int i=0;i<k;i++) cin>>x>>y, has[x][y]=1;        cout<<"Case "<<++kase <<": "<<dfs(0,n,0,m)<<"\n";    }    return 0;}


0 0
原创粉丝点击