经典背包一笔带过。
区间dp搞出状态转移方程后其实也是没什么问题,花了一段时间把内容过掉题打掉之后,卡在了二维区间dp的棋盘分割上,对照几个程序一时间没找到错误,先暂扔上来吧。下午因为切线搞了一阵子,反倒是还是没搞出来,现在代码我也不知道哪些改了哪些没改,因为突然发现有两个打一半的棋盘分割。
区间dp第一名好厉害口牙,全满了,我们一中要起飞了口牙。
#include
using namespace std;
int n,sum[100][100];
double X,f[20][20][20][20][20];
double su(int x1,int y11,int x2,int y2){
double ans=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y11-1]+sum[x1-1][y11-1];
return ans * ans ;
}
int main(){
cin>>n;
for(int i=1;i<=8;i++){
for(int j=1;j>sum[i][j];
}
}
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
sum[i][j]+=sum[i-1][j]-sum[i-1][j-1]+sum[i][j-1];
}
}
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cout<<sum[i][j]<<" ";
}
cout<<endl;
}
cout<<sum[8][8]<<endl;
X=(double)sum[8][8]/n;
for(int x1=1; x1<=8; ++x1)
for(int y11=1; y11<=8; ++y11)
for(int x2=x1; x2<=8; ++x2)
for(int y2=y11; y2<=8; ++y2)//{
f[x1][x2][y11][y2][0]=su(x1,y11,x2,y2);
// cout<<f[x1][x2][y11][y2][0]<<endl;}
cout<<X<<endl;
for(int k=0;k<n;k++){
for(int lenx=1;lenx<=8;lenx++){
for(int lx;lx+lenx-1<=8;lx++){
int rx=lx+lenx-1;
for(int leny=1;leny<=8;leny++){
for(int ly=1;ly+leny-1<=8;ly++){
int ry=ly+leny-1;
// if(!k){
// f[lx][rx][ly][ry][k]=su(lx,ly,rx,ry);
// continue;
// }
// else{
f[lx][rx][ly][ry][k]=0x3f3f3f3f;
// continue;
// }
if(lenx!=1){
for(int kx=lx;kx<rx;kx++){
f[lx][rx][ly][ry][k]=min(f[lx][rx][ly][ry][k],min(f[lx][kx][ly][ry][0]+f[kx+1][rx][ly][ry][k-1],f[lx][kx][ly][ry][k-1]+f[kx+1][rx][ly][ry][0]));
}
}
if(leny!=1){
for(int ky=ly;ky<ry;ky++){
f[lx][rx][ly][ry][k]=min(f[lx][rx][ly][ry][k],min(f[lx][rx][ly][ky][0]+f[lx][rx][ky+1][ry][k-1],f[lx][rx][ly][ky][k-1]+f[lx][rx][ky+1][ry][0]));
}
}
}
}
}
}
}
cout<<f[1][8][1][8][n-1]<<endl<<X<<endl;
printf("%.3lf",sqrt(f[1][8][1][8][n-1]-X*X));
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,sum[100][100];
double X,f[20][20][20][20][20];
double su(int x1,int y11,int x2,int y2){
double ans=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y11-1]+sum[x1-1][y11-1];
return ans * ans ;
}
int main(){
cin>>n;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cin>>sum[i][j];
}
}
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
sum[i][j]+=sum[i-1][j]-sum[i-1][j-1]+sum[i][j-1];
}
}
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cout<<sum[i][j]<<" ";
}
cout<<endl;
}
cout<<sum[8][8]<<endl;
cin>>X;
X=(double)sum[8][8]/n;
for(int x1=1; x1<=8; ++x1)
for(int y11=1; y11<=8; ++y11)
for(int x2=x1; x2<=8; ++x2)
for(int y2=y11; y2<=8; ++y2)//{
f[x1][x2][y11][y2][0]=su(x1,y11,x2,y2);
// cout<<f[x1][x2][y11][y2][0]<<endl;}
cout<<X<<endl;
for(int k=1;k<n;k++){
// for(int lenx=1;lenx<=8;lenx++){
for(int lx;lx<=8;lx++){
// int rx=lx+lenx-1;
for(int ly=1;ly<=8;ly++){
for(int rx=lx;rx<=8;rx++){
for(int ry=ly;ry<=8;ry++){
// int ry=ly+leny-1;
// if(!k){
// f[lx][rx][ly][ry][k]=su(lx,ly,rx,ry);
// continue;
// }
// else{
f[lx][rx][ly][ry][k]=0x3f3f3f3f;
// continue;
// }
// if(lenx!=1){
for(int kx=lx;kx<rx;kx++){
f[lx][rx][ly][ry][k]=min(f[lx][rx][ly][ry][k],min(f[lx][kx][ly][ry][0]+f[kx+1][rx][ly][ry][k-1],f[lx][kx][ly][ry][k-1]+f[kx+1][rx][ly][ry][0]));
}
// }
// if(leny!=1){
for(int ky=ly;ky<ry;ky++){
f[lx][rx][ly][ry][k]=min(f[lx][rx][ly][ry][k],min(f[lx][rx][ly][ky][0]+f[lx][rx][ky+1][ry][k-1],f[lx][rx][ly][ky][k-1]+f[lx][rx][ky+1][ry][0]));
}
// }
}
}
}
}
}
cout<<f[1][8][1][8][n-1]<<endl<<X<<endl;
printf("%.3lf",sqrt(f[1][8][1][8][n-1]-X*X));
return 0;
}