1191棋盘分割
有思路,但是老是出错
人家的答案
#include <cstdio> #include <iostream> #include <cmath> using namespace std; const double INF = 999999.99; double dp[16][9][9][9][9]; double s[9][9]; double ave; int main() { int i,j,u,v,n,k,g; scanf("%d",&n); for(i=0;i<=8;i++) s[i][0]=s[0][i]=0.0; for(i=1;i<=8;i++) for(j=1;j<=8;j++) { scanf("%lf",&s[i][j]); s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1]; } ave = s[8][8]/n; for(i=1;i<=8;i++) for(j=1;j<=8;j++) for(u=i;u<=8;u++) for(v=j;v<=8;v++) { double p = s[u][v] - s[u][j-1] - s[i-1][v] + s[i-1][j-1]; dp[1][i][j][u][v]=(p-ave)*(p-ave); } for(k=2;k<=n;k++) { for(i=1;i<=8;i++) for(j=1;j<=8;j++) for(u=i;u<=8;u++) for(v=j;v<=8;v++) { double &p=dp[k][i][j][u][v]; p = INF; double t , l; for(g=i;g<u;g++) { t = dp[1][i][j][g][v]; l = dp[k-1][g+1][j][u][v]; if(t + l < p) p = t + l; t = dp[k-1][i][j][g][v]; l = dp[1][g+1][j][u][v]; if(t + l < p) p = t + l; } for(g=j;g<v;g++) { t = dp[1][i][j][u][g]; l = dp[k-1][i][g+1][u][v]; if(t + l < p) p = t + l; t = dp[k-1][i][j][u][g]; l = dp[1][i][g+1][u][v]; if(t + l < p) p = t + l; } } } printf("%.3lf\n", (double)sqrt(dp[n][1][1][8][8]/n) ); return 0; }
以后再回来看看