社区讨论

记忆化搜索一种写法40,一种写法AC,有人能解释下吗

P1436棋盘分割参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@lo2n6rtq
此快照首次捕获于
2023/10/23 16:35
2 年前
此快照最后确认于
2023/10/23 16:35
2 年前
查看原帖
CPP
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
#include<stack>
#include<functional>
#include<map>
#include<queue>
using namespace std;
template<typename T>
inline void cmax(T& a,const T& b){a<b?a=b:0;}
template<typename T>
inline void cmin(T& a,const T& b){b<a?a=b:0;}
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef vector<int> vi;
typedef vector<vector<int> > vii;
#define fi first
#define se second
template<typename _T>
inline void read(_T &_x) {
    _x = 0;
    _T _f = 1;
    char _ch = getchar();
    while (_ch < '0' || '9' < _ch) {
        if (_ch == '-') _f = -1;
        _ch = getchar();
    }
    while ('0' <= _ch && _ch <= '9') {
        _x = (_x << 3) + (_x << 1) + (_ch & 15);
        _ch = getchar();
    }
    _x *= _f;
}
template<typename _T>
inline void write(_T _x) {
    if (_x < 0) {
        putchar('-');
        _x = -_x;
    }
    if (_x > 9) write(_x / 10);
    putchar('0' + _x % 10);
}
#define int long long
int n;
int val[20][20],sum[20][20],dd[20][20][20][20][20];
int dfs(int x1,int y1,int x2,int y2,int d){
    if(dd[x1][y1][x2][y2][d]!=-1){
        return dd[x1][y1][x2][y2][d];
    }
    if((x2-x1+1)*(y2-y1+1)<d)return 1e18;
    if(d==1){
        int t=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
        return t*t;
    }
    int ans=1e18;
//    for(int i=x1;i<x2;i++){
//        for(int j=1;j<d;j++){
//            ans=min(ans,dfs(x1,y1,i,y2,j)+dfs(i+1,y1,x2,y2,d-j));
//        }
//    }
//    for(int i=y1;i<y2;i++){
//        for(int j=1;j<d;j++){
//            ans=min(ans,dfs(x1,y1,x2,i,j)+dfs(x1,i+1,x2,y2,d-j));
//        }
//    }
    for(int i=x1;i<x2;i++){
        ans=min(ans,dfs(x1,y1,i,y2,d-1)+dfs(i+1,y1,x2,y2,1));
        ans=min(ans,dfs(x1,y1,i,y2,1)+dfs(i+1,y1,x2,y2,d-1));
    }
    for(int i=y1;i<y2;i++){
        ans=min(ans,dfs(x1,y1,x2,i,d-1)+dfs(x1,i+1,x2,y2,1));
        ans=min(ans,dfs(x1,y1,x2,i,1)+dfs(x1,i+1,x2,y2,d-1));
    }
    dd[x1][y1][x2][y2][d]=ans;
    return ans;
}
signed main(){
    memset(dd,-1,sizeof(dd));
    read(n);
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            cin>>val[i][j];
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+val[i][j];
        }
    }
    cout<<dfs(1,1,8,8,n)<<endl;
    return 0;
}


------------

回复

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

正在加载回复...