poj 1191 动态规划
题意:棋盘分割 黑书P116
int a[8][8]; int n; double SUM; int dp[15][8][8][8][8]; int P(int x1, int y1, int x2, int y2){ int s=0; FOE(i, x1, x2) FOE(j, y1, y2) s+=a[i][j]; return s * s; } void readData(){ cin>>n; FOR(i, 0, 8) FOR(j, 0, 8){ cin>>a[i][j]; SUM+=a[i][j]; } } int solve(int k,int x1,int y1,int x2,int y2){ if(dp[k][x1][y1][x2][y2]) return dp[k][x1][y1][x2][y2]; if(k==1){ dp[k][x1][y1][x2][y2] = P(x1,y1,x2,y2); return dp[k][x1][y1][x2][y2]; } int Max=99999999; FOR(i, x1, x2){ int t1=solve(k-1,x1,y1,i,y2)+P(i+1,y1,x2,y2); int t2=solve(k-1,i+1,y1,x2,y2)+P(x1,y1,i,y2); checkmin(Max, min(t1, t2)); } FOR(j, y1, y2){ int t1=solve(k-1,x1,y1,x2,j)+P(x1,j+1,x2,y2); int t2=solve(k-1,x1,j+1,x2,y2)+P(x1,y1,x2,j); checkmin(Max, min(t1, t2)); } dp[k][x1][y1][x2][y2] = Max; return dp[k][x1][y1][x2][y2]; } int main(){ readData(); double m=(double)solve(n,0,0,7,7)/n- SUM/n* SUM/n; cout<<fixed<<setprecision(3)<<sqrt(m)<<endl; return 0; }