PKU 1191
2011-06-01 16:08
337 查看
#include <iostream> #include <cmath> using namespace std; const int inf = 1000000000; const int maxs = 9; const int maxn = 15; int n; int mat[maxs][maxs]; int dp[maxn][maxs][maxs][maxs][maxs]; void solve() { int k, f, x1, y1, x2, y2; for (x1 = 1; x1 <= 8; x1++) { for (y1 = 1; y1 <= 8; y1++) { for (x2 = x1; x2 <= 8; x2++) { for (y2 = y1; y2 <= 8; y2++) { int tmp = mat[x2][y2] - mat[x1-1][y2] - mat[x2][y1-1] + mat[x1-1][y1-1]; dp[0][x1][y1][x2][y2] = tmp * tmp; } } } } for (k = 1; k < n; k++) { for (x1 = 1; x1 <= 8; x1++) { for (y1 = 1; y1 <= 8; y1++) { for (x2 = x1; x2 <= 8; x2++) { for (y2 = y1; y2 <= 8; y2++) { dp[k][x1][y1][x2][y2] = inf; for (f = x1; f < x2; f++) { int tmp = min(dp[k-1][x1][y1][f][y2] + dp[0][f+1][y1][x2][y2], dp[0][x1][y1][f][y2] + dp[k-1][f+1][y1][x2][y2]); if (tmp < dp[k][x1][y1][x2][y2]) dp[k][x1][y1][x2][y2] = tmp; } for (f = y1; f < y2; f++) { int tmp = min(dp[k-1][x1][y1][x2][f] + dp[0][x1][f+1][x2][y2], dp[0][x1][y1][x2][f] + dp[k-1][x1][f+1][x2][y2]); if (tmp < dp[k][x1][y1][x2][y2]) dp[k][x1][y1][x2][y2] = tmp; } } } } } } } int main() { int i, j; scanf("%d", &n); memset(mat, 0, sizeof(mat)); memset(dp, 0, sizeof(dp)); for (i = 1; i <= 8; i++) { for (j = 1; j <= 8; j++) { scanf("%d", &mat[i][j]); mat[i][j] = mat[i][j] + mat[i-1][j] + mat[i][j-1] - mat[i-1][j-1]; } } double ave = 1.0 * mat[8][8] / n; solve(); printf("%.3lf/n", sqrt(1.0 * dp[n-1][1][1][8][8] / n - ave * ave)); return 0; }
相关文章推荐
- pku1191 棋盘分割 DP
- PKU 1191 棋盘分割 递归解法
- pku 1191 棋盘分割 DP / 记忆化搜索
- pku 1191 棋盘分割(DP,一点点数学)
- PKU1191 chessboard devision
- 【DP+记忆化搜索】PKU-1191-棋盘分割
- pku1979
- pku 3368_Frequent values
- [RMQ]Pku3368-Frequent values
- PKU 学生的反馈 2009-1
- pku2606 Rabbit hunt
- PKU/POJ 3039 Close Encounter
- pku2948 Martian Mining
- pku3292 Semi-prime H-numbers
- pku3249 Test for Job
- pku 2187(平面最远点对距离)
- PKU 2385 各个版本的解法
- PKU 2992 【质因数分解】
- PKU 3322 【BFS】
- [PKU 2104]K-th Number(归并树)