poj 1191 棋盘分割 (dp)
2012-08-11 09:34
495 查看
好纠结的一道题啊,一开始 写错了个字母 ,跳了半天,后来脚上去竟然不对,,看了 discuss 里面的 将 所有数据 改为 double 类型 秒过,汗。。。。。。。。。
棋盘分割
Description
将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)
View Code
棋盘分割
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9151 | Accepted: 3215 |
将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)
View Code
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<set> #include<map> #include<queue> #include<vector> #include<string> #define Min(a,b) a<b?a:b #define Max(a,b) a>b?a:b #define CL(a,num) memset(a,num,sizeof(a)); #define maxn 205 #define eps 1e-6 #define inf 9999999 #define mx 1<<60 using namespace std; double mat[10][10]; double dp[20][10][10][10][10]; double s[10][10][10][10] ; void init() { int i,j,k,l; double sum = 0; for( i = 1;i <= 8;++i) { for( j = i; j <= 8 ;++j) { for(k = 1 ; k <= 8; ++k ) { sum = 0; for(l = k ; l <= 8 ;++l) { sum += mat[l][j] - mat[l][i - 1] ; s[k][i][l][j] = sum*sum; } } } } } double dfs(int k,int x1,int y1,int x2,int y2) { int i; double tmp ; if(dp[k][x1][y1][x2][y2] >= eps ) return dp[k][x1][y1][x2][y2] ; if( k == 1) { dp[k][x1][y1][x2][y2] = s[x1][y1][x2][y2] ; return dp[k][x1][y1][x2][y2] ; } else { double ans = inf ; for(i = x1; i < x2; ++i) { tmp = min(dfs(k - 1,x1,y1, i,y2) + s[i+1][y1][x2][y2],dfs(k - 1,i+1,y1,x2,y2) + s[x1][y1][i][y2]); ans = min(ans,tmp); } for(i = y1; i < y2 ; ++i ) { tmp = min(dfs(k - 1,x1,y1,x2,i) + s[x1][i + 1][x2][y2],dfs(k - 1,x1,i+1,x2,y2) + s[x1][y1][x2][i]); ans = min(ans,tmp); } dp[k][x1][y1][x2][y2] = ans ; return dp[k][x1][y1][x2][y2]; } } int main() { int n,i,j; double a; //freopen("data.in","r",stdin); scanf("%d",&n); double cnt = 0; for( i = 1;i <= 8;++i ) { double sum = 0; for( j = 1; j <= 8 ;++j) { scanf("%lf",&a); sum += a; cnt +=a; mat[i][j] = sum ; } } init(); double k = cnt/(n*1.0); double ans = dfs(n,1,1,8,8); ans = (ans/(n*1.0)) - k*k ; ans = sqrt(ans); printf("%.3lf\n",ans); }
相关文章推荐
- poj1191 [NOI1999] 棋盘分割(dp)
- POJ 1191 棋盘分割(DP)
- poj-1191- 棋盘分割dp
- POJ 1191 棋盘分割 DP
- POJ 1191 棋盘分割【区间类DP】
- poj1191-dp棋盘分割
- poj 1191 棋盘分割(dp,黑书dp例二)
- POJ 1191 棋盘分割(DP)
- poj 1191 棋盘分割 (DFS+DP思想)
- 经典问题六.【二维的区间dp】棋盘分割 poj 1191
- poj 1191 棋盘分割(DP)
- POJ 1191 棋盘分割 DP
- POJ 1191 && HDU 2517 棋盘分割(dp)
- 棋盘分割----POJ1191----DP
- poj 1191棋盘分割(递归dp, 记忆化搜索)
- POJ 1191 棋盘分割(DP)
- poj1191--棋盘分割(dp)
- POJ1191 棋盘分割(DP)
- poj 1191 棋盘分割 【区间dp 记忆化】
- poj 1191 棋盘分割 DP