1.这题的经典之处感觉不在记忆化搜索,而是在区域化的预处理,之前就碰到过好多这样的题目了。
s[x1,y1,x2,y2]表示从(x1,y1)到(x2,y2)的面积,可以转换为s[x2,y2]-s[x1-1,y2]-s[x1,y2-1]+s[x1-1][y1-1];其中s[x2,y2]表示从(0,0)至(x2,y2)的面积
2.代码(g++WA,c++AC),求解释!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define MAX 1000000000
#define N 8//!!
#define M 10
using namespace std;
// freopen("data.in","r",stdin);
int mat[M][M],s[M][M];
int ropow[M][M][M][M][15];
void prepare()
{
int i,j;
s[0][0]=mat[0][0];
for(i=1; i<N; i++)
{
s[0][i]=s[0][i-1]+mat[0][i];//
s[i][0]=s[i-1][0]+mat[i][0];
}
for(i=1; i<N; i++)
{
for(j=1; j<N; j++)
{
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+mat[i][j];
}
}
}
int getArea(int x1,int y1,int x2,int y2)
{
int sum=s[x2][y2];
if(x1>0)sum-=s[x1-1][y2];
if(y1>0)sum-=s[x2][y1-1];
if(x1>0&&y1>0)sum+=s[x1-1][y1-1];
return sum*sum;//
}
int dfs(int x1,int y1,int x2,int y2,int k)//x1<=x2,y1<=y2,k>=0
{
if(ropow[x1][y1][x2][y2][k]!=-1)return ropow[x1][y1][x2][y2][k];
if(k==0)return ropow[x1][y1][x2][y2][k]=getArea(x1,y1,x2,y2);
else if(x1==x2&&y1==y2)return ropow[x1][y1][x2][y2][k]=MAX;
int i;
ropow[x1][y1][x2][y2][k]=MAX;
int tmp;
for(i=x1; i<x2; i++)
{
tmp=dfs(x1,y1,i,y2,k-1)+getArea(i+1,y1,x2,y2);
if(tmp<ropow[x1][y1][x2][y2][k])ropow[x1][y1][x2][y2][k]=tmp;
tmp=getArea(x1,y1,i,y2)+dfs(i+1,y1,x2,y2,k-1);
if(tmp<ropow[x1][y1][x2][y2][k])ropow[x1][y1][x2][y2][k]=tmp;
}
for(i=y1; i<y2; i++)
{
tmp=dfs(x1,y1,x2,i,k-1)+getArea(x1,i+1,x2,y2);
if(tmp<ropow[x1][y1][x2][y2][k]) ropow[x1][y1][x2][y2][k]=tmp;
tmp=getArea(x1,y1,x2,i)+dfs(x1,i+1,x2,y2,k-1);
if(tmp<ropow[x1][y1][x2][y2][k])ropow[x1][y1][x2][y2][k]=tmp;
}
return ropow[x1][y1][x2][y2][k];
}
int main()
{
// freopen("data.in","r",stdin);
int block;
cin>>block;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)cin>>mat[i][j];
}
prepare();
memset(ropow,-1,sizeof(ropow));
double ro2=dfs(0,0,N-1,N-1,block-1);//
double tot=s[N-1][N-1];
tot/=block;
tot*=tot;
double t=sqrt(ro2/block-tot );
printf("%.3lf\n",t) ;
return 0;
}
1.状态方程中用到加法,而上界用了INT_MAX,结果出现了负数------以后出现负数,注意是否越界!
2.把题目输入的n当成切割次数,结果瞎调了半天!-------不知道错了哪里时就重新读一启遍题!