社区讨论

记忆化搜索 RE求调

UVA1629切蛋糕 Cake slicing参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m20dl6my
此快照首次捕获于
2024/10/08 19:46
去年
此快照最后确认于
2025/11/04 17:38
4 个月前
查看原帖
rt
UVA1629
C
/*  Erica N  */
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair
#define int long long
#define ull unsigned long long
#define pii pair<int, int>
#define ps second
#define pf first
#define itn int

#define rd read()
int read(){
    int xx = 0, ff = 1;char ch = getchar();
    while (ch < '0' || ch > '9') {if (ch == '-')ff = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9')xx = xx * 10 + (ch - '0'), ch = getchar();
    return xx * ff;
}

#define cdbg(x...) do { cerr << #x << " -> "; err(x); } while (0)
void err() { cerr << endl; }
template<template<typename...> class T, typename t, typename... A>
void err(T<t> a, A... x) { for (auto v: a) cerr << v << ' '; err(x...); }
template<typename T, typename... A>
void err(T a, A... x) { cerr << a << ' '; err(x...); }


const int N = 3e1 + 5;
const int INF = 1e18;
const int M = 1e7;
const int MOD = 1e9 + 7;

int x[N];
int y[N];
int f[N][N][N][N];
int p[N][N];

inline int check(int x,int y,int a,int b){
    return p[a][b]-p[a][y-1]-p[x-1][b]+p[x-1][y-1];
}

int dfs(int x,int y,int a,int b){

    if(INF>f[x][y][a][b])return f[x][y][a][b];
    if(check(x,y,a,b)==1)return f[x][y][a][b]=0;

    for(int i=x;i<a;i++){
        if(check(x,y,i,b)>=1&&check(i+1,y,a,b)>=1){
            f[x][y][a][b]=min(f[x][y][a][b],dfs(x,y,i,b)+dfs(i+1,y,a,b)+b-y+1);
        }
    }

    
    for(int i=y;i<b;i++){
        if(check(x,y,a,i)>=1&&check(x,i+1,a,b)>=1){
            f[x][y][a][b]=min(f[x][y][a][b],dfs(x,y,a,i)+dfs(x,i+1,a,b)+a-x+1);
        }
    }

    return f[x][y][a][b];
}

void solve(){
    // cdbg(N);
    int n,m,K;
    int T=0;
    while(cin>>n>>m>>K){
        T++;
        printf("Case %lld: ",T);
        memset(p,0,sizeof p);
        for(int i=1;i<=n;i++){
            int x=rd,y=rd;
            p[x][y]=1;
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                p[i][j]+=p[i-1][j]+p[i][j-1]-p[i-1][j-1];
            }
        }

        memset(f,0x3f3f,sizeof f);

        cout<<dfs(1,1,n,m)<<endl;
    }



}

signed main() {
    // freopen(".in","r",stdin);
    // freopen(".out","w",stdout);

    int T=1;
    while(T--){
    	solve();
    }
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...