好纠结的一道题啊,一开始 写错了个字母 ,跳了半天,后来脚上去竟然不对,,看了 discuss 里面的 将 所有数据 改为 double 类型 秒过,汗。。。。。。。。。
棋盘分割
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 9151 | Accepted: 3215 |
Description
将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 均方差 ,其中平均值 ,x i为第i块矩形棋盘的总分。 请编程对给出的棋盘及n,求出O'的最小值。
Input
第1行为一个整数n(1 < n < 15)。 第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。
Output
仅一个数,为O'(四舍五入精确到小数点后三位)。
Sample Input
31 1 1 1 1 1 1 31 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 01 1 1 1 1 1 0 3
Sample Output
1.633
Source
题解:
首先将 原式化简 为 ∑xi^2 - (平均值的平方) 而 平均值是已知的 所以为我们只要球前者就可以
每一刀,我们只能按 x轴方向切 或 y 方向切
用 dp[k][x1][y1][x2][y2] 表示 将 以 x1,y1,为左上角,x2,y2,为右下角的矩形 分成 k 分的最小值
s[x1][y1][x2][y2] 表示 以 x1,y1,为左上角,x2,y2,为右下角的矩形的 平方
状态转移 为dp[k][x1][y1][x2][y2] = min(dp[k - 1][x1][y1][ i ][y2]) + s[i+1][y1][x2][y2], dp[k - 1][x1][y1][i + 1][y2] + s[x1][y1][i][y2]) (沿 x 轴切)
min(dp[k - 1][x1][y1][ x2][i]) + s[x1][i + 1][x2][y2], dp[k - 1][x1][i + 1][x2][y2] + s[x1][y1][x2][ i ]);
代码:
View Code
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include