POJ 1191 棋盘分割 (记忆化搜索)

网友投稿 579 2022-08-26

POJ 1191 棋盘分割 (记忆化搜索)

POJ 1191 棋盘分割 (记忆化搜索)

Description

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

思路

首先对方差公式进行化简,化简之后为 σ2=∑ni=1x2in−x¯2

然后使用dfs搜索时进行切割, ​​dp[x][y][a][b][k]​​​ 代表进行 ​​n-k​​​ 次切割以后矩阵 ​​(x,y)-(a,b)​​ 分值和的平方。

因为平均数是定值,要使方差最小,只能让各块的和尽可能的小。

AC 代码

#include#include#include#include#include#includeusing namespace std;#include#include#define INF (1<<25)int n,sum[10][10];int dp[10][10][10][10][16];int get(int x,int y,int a,int b){ return sum[a][b]-sum[a][y-1]-sum[x-1][b]+sum[x-1][y-1];}int dfs(int x,int y,int a,int b,int k){ if(dp[x][y][a][b][k]!=-1)return dp[x][y][a][b][k]; //记忆化搜索 if(k==1)return (dp[x][y][a][b][k]=get(x,y,a,b)*get(x,y,a,b)); //返回当前块的和的平方 int minn=INF; for(int i=x; i

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:POJ 3280 Cheapest Palindrome (区间DP)
下一篇:POJ 1054 The Troublesome Frog (枚举+优化)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~