P1436 棋盘分割

来源:互联网 发布:淘宝客的推广链接 编辑:程序博客网 时间:2024/06/06 01:22

记忆化搜索。一眼题不解释。

感觉这道题不值得我写博客。

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<vector>#include<queue>using namespace std;#define rep(i,j,k) for(i=j;i<=k;++i)#define per(i,j,k) for(i=j;i>=k;--i)#define sqr(x) ((x)*(x))#define G getchar()#define LL long long#define pii pair<int,int>#define mkp make_pair#define X first#define Y second#define N 501#define NN 1005#define inf 1061109567int a[9][9],f[15][9][9][9][9]; int read(){int x=0;char ch=G;while(ch<48||ch>57)ch=G;for(;ch>47&&ch<58;ch=G)x=x*10+ch-48;return x;}void solve(int k,int U,int D,int L,int R){int i,j,&x=f[k][U][D][L][R];if(x<inf||D-U+R-L<k)return;if(!k){int sum=0;rep(i,U,D)rep(j,L,R)sum+=a[i][j];x=sqr(sum);return;}rep(i,U,D-1){solve(k-1,U,i,L,R);solve(0,i+1,D,L,R);solve(0,U,i,L,R);solve(k-1,i+1,D,L,R);x=min(x,min(f[k-1][U][i][L][R]+f[0][i+1][D][L][R],f[0][U][i][L][R]+f[k-1][i+1][D][L][R]));}rep(i,L,R-1){solve(k-1,U,D,L,i);solve(0,U,D,i+1,R);solve(0,U,D,L,i);solve(k-1,U,D,i+1,R);x=min(x,min(f[k-1][U][D][L][i]+f[0][U][D][i+1][R],f[0][U][D][L][i]+f[k-1][U][D][i+1][R]));}}int main(){int n=read()-1,i,j;rep(i,1,8)rep(j,1,8)a[i][j]=read();memset(f,63,sizeof f);solve(n,1,8,1,8);printf("%d\n",f[n][1][8][1][8]);return 0;}


原创粉丝点击