poj 1191 棋盘分割(dp,黑书dp例二)
2014-05-20 09:02
405 查看
poj 1191 棋盘分割
状态转移方程来自lrj黑书,dp递推实现
慢慢积累dp经验
注意这里输出的时候用%f,用%lf会WA
状态转移方程来自lrj黑书,dp递推实现
慢慢积累dp经验
注意这里输出的时候用%f,用%lf会WA
#include<stdio.h> #include<string.h> #include<math.h> #define INF 50000000 int m[9][9],t[9][9]; int dp[15][9][9][9][9]; int s(int x1,int y1,int x2,int y2) { int ans=t[x2][y2]-t[x1-1][y2]-t[x2][y1-1]+t[x1-1][y1-1]; return ans*ans; } void ini() { for(int i=1;i<=8;i++) for(int j=1;j<=8;j++) t[i][j]=t[i-1][j]+t[i][j-1]-t[i-1][j-1]+m[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]=s(x1,y1,x2,y2); } int min(int a,int b) {return a<b?a:b;} int main() { int n; while(scanf("%d",&n)!=EOF) { double ave=0; for(int i=1;i<=8;i++) for(int j=1;j<=8;j++) { scanf("%d",&m[i][j]); ave+=m[i][j]; } ave/=n*1.0; ini(); 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 a=x1;a<=x2-1;a++) { int temp=min(dp[k-1][x1][y1][a][y2] +s(a+1,y1,x2,y2), dp[k-1][a+1][y1][x2][y2] +s(x1,y1,a,y2)); dp[k][x1][y1][x2][y2]=min(dp[k][x1][y1][x2][y2],temp); } for(int b=y1;b<=y2-1;b++) { int temp=min(dp[k-1][x1][y1][x2][b] +s(x1,b+1,x2,y2), dp[k-1][x1][b+1][x2][y2] +s(x1,y1,x2,b)); dp[k][x1][y1][x2][y2]=min(dp[k][x1][y1][x2][y2],temp); } } printf("%.3f\n",sqrt(dp[n-1][1][1][8][8]*1.0/n-ave*ave)); } return 0; }
相关文章推荐
- poj 1191 棋盘分割 dp-进阶
- POJ 1191 棋盘分割【区间类DP】
- poj1191--棋盘分割(dp)
- poj1191 [NOI1999] 棋盘分割(dp)
- POJ 1191 && HDU 2517 棋盘分割(dp)
- 棋盘分割----POJ1191----DP
- poj 1191 棋盘分割 DP
- POJ 1191 棋盘分割 DP
- poj 1191 棋盘分割 (dp)
- 【DP】 POJ 1191 棋盘分割 记忆化搜索
- poj1191 棋盘分割 dp
- POJ 1191 棋盘分割(DP)
- 【DP】 POJ 1191 棋盘分割 记忆化搜索
- poj1191-dp棋盘分割
- 经典问题六.【二维的区间dp】棋盘分割 poj 1191
- poj 1191棋盘分割(递归dp, 记忆化搜索)
- poj - 1191 - 棋盘分割(dp)
- POJ 1191 棋盘分割 (DP)
- POJ1191 棋盘分割(DP)
- poj 1191 棋盘分割(DP)