POJ 1191 棋盘分割
2016-08-02 00:01
337 查看
题目链接
题意:中文题就不说了。。。
分析:把式子化简下就是求sigma(xi^2)的最小值。dp[x1][y1][x2][y2][k]表示在(x1,y1)和(x2,y2 )的矩形内切第k刀。则可以横切也可以纵切。
dp[k][x1][y1][x2][y2]=min(min(dp[k][x1][y1][x2][y2],dp[k-1][x1][y1][t][y2]+dp[0][t+1][y1][x2][y2]),dp[0][x1][y1][t][y2]+dp[k-1][t+1][y1][x2][y2]);
dp[k][x1][y1][x2][y2]=min(min(dp[k][x1][y1][x2][y2],dp[k-1][x1][y1][x2][t]+dp[0][x1][t+1][x2][y2]),dp[0][x1][y1][x2][t]+dp[k-1][x1][t+1][x2][y2]);
题意:中文题就不说了。。。
分析:把式子化简下就是求sigma(xi^2)的最小值。dp[x1][y1][x2][y2][k]表示在(x1,y1)和(x2,y2 )的矩形内切第k刀。则可以横切也可以纵切。
dp[k][x1][y1][x2][y2]=min(min(dp[k][x1][y1][x2][y2],dp[k-1][x1][y1][t][y2]+dp[0][t+1][y1][x2][y2]),dp[0][x1][y1][t][y2]+dp[k-1][t+1][y1][x2][y2]);
dp[k][x1][y1][x2][y2]=min(min(dp[k][x1][y1][x2][y2],dp[k-1][x1][y1][x2][t]+dp[0][x1][t+1][x2][y2]),dp[0][x1][y1][x2][t]+dp[k-1][x1][t+1][x2][y2]);
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include <iomanip> #include<iostream> using namespace std; const double inf=(double)(1<<30); double dp[15][9][9][9][9]; double sum[9][9]; double a[9][9]; double count(int x1,int y1,int x2,int y2) { double res=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]; return res*res; } int main(void) { int n; double tot; while(scanf("%d",&n)==1) { tot=0; memset(sum,0,sizeof(sum)); for(int i=1;i<=8;i++) { for(int j=1;j<=8;j++) { scanf("%lf",&a[i][j]); tot+=a[i][j]; sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j]; } } for(int x1=1;x1<=8;x1++) { for(int y1=1;y1<=8;y1++) { for(int x2=x1;x2<=8;x2++) { for(int y2=y1;y2<=8;y2++) dp[0][x1][y1][x2][y2]=count(x1,y1,x2,y2); } } } for(int k=1;k<n;k++) { for(int x1=1;x1<=8;x1++) { for(int y1=1;y1<=8;y1++) { for(int x2=x1;x2<=8;x2++) { for(int y2=y1;y2<=8;y2++) { dp[k][x1][y1][x2][y2]=inf; for(int t=x1;t<x2;t++) dp[k][x1][y1][x2][y2]=min(min(dp[k][x1][y1][x2][y2],dp[k-1][x1][y1][t][y2]+dp[0][t+1][y1][x2][y2]),dp[0][x1][y1][t][y2]+dp[k-1][t+1][y1][x2][y2]); for(int t=y1;t<y2;t++) dp[k][x1][y1][x2][y2]=min(min(dp[k][x1][y1][x2][y2],dp[k-1][x1][y1][x2][t]+dp[0][x1][t+1][x2][y2]),dp[0][x1][y1][x2][t]+dp[k-1][x1][t+1][x2][y2]); } } } } } double ans=dp[n-1][1][1][8][8]*1.0/n - ((double)tot*1.0/n)*((double)tot*1.0/n); // printf("%.3lf\n",(double)sqrt(ans)); cout<<setprecision(3)<<fixed<<sqrt(ans)<<endl; } return 0; }
相关文章推荐
- POJ1191棋盘分割 NYOJ87
- poj 1191 棋盘分割 DP
- poj 1191 棋盘分割(记忆化dp+递归)
- 棋盘分割 动态规划 poj 1191
- POJ 1191 棋盘分割(DP)
- 【递归 & 动态规划】POJ 1191 棋盘分割
- poj1191-棋盘分割问题
- POJ 1191 棋盘分割 中文
- POJ 1191 棋盘分割
- POJ-1191-棋盘分割
- POJ 1191 棋盘分割 (DP)
- POJ 1191 棋盘分割 简单记忆化dfs
- poj 1191 棋盘分割 记忆化搜索
- poj 1191 棋盘分割 dp-进阶
- poj 1191 棋盘分割 (DFS+DP思想)
- POJ 1191 棋盘分割 DP
- POJ 1191 棋盘分割(DP)
- poj 1191 棋盘分割(DP)
- poj 1191 棋盘分割
- 经典递归问题--棋盘分割 POJ--1191