社区讨论
记忆化搜索一种写法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 条回复,欢迎继续交流。
正在加载回复...