DP--POJ1191 棋盘分割
题目描述
分析:
代码:
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cctype> using namespace std;int s[9][9],MIN; //MIN是一个陷阱 可以去掉 千万不能把MIN在fun函数中做全局变量来用,会GG int sum[9][9]; int res[15][9][9][9][9];int r_sum(int x1,int y1,int x2, int y2){ //求任意矩形内所有数之和 return sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2]; }int fun(int n,int x1,int y1,int x2,int y2){ //以x1,y1和x2,y2构成的 内含n个矩形 的矩形其“内部各个矩形的数字和的平方 的和”最小值 int i,l,tp,z,y,s,x,MIN=100000000; if( res[n][x1][y1][x2][y2]!=-1 ) return res[n][x1][y1][x2][y2];if(n==1){int l1=r_sum(x1,y1,x2,y2);res[n][x1][y1][x2][y2]=l1*l1;return l1*l1;}for(i=x1;i<x2;i++){ //纵切,留左留右哪个好?z=r_sum(x1,y1,i,y2);y=r_sum(i+1,y1,x2,y2);tp=min(y*y+fun(n-1,x1,y1,i,y2),z*z+fun(n-1,i+1,y1,x2,y2) ); if( tp<MIN ) MIN=tp;}for(l=y1;l<y2;l++){ //横切,留上留下哪个好?s=r_sum(x1,y1,x2,l); x=r_sum(x1,l+1,x2,y2); tp=min(s*s+fun(n-1,x1,l+1,x2,y2),x*x+fun(n-1,x1,y1,x2,l) );if( tp<MIN ) MIN=tp; // 四种切法哪个好?}res[n][x1][y1][x2][y2]=MIN; //最好的return MIN; }int main(){ // freopen("in.txt","r",stdin);memset(sum,0,sizeof(sum));memset(res,-1,sizeof(res));int n,i_sum;cin>>n;for(int i=1;i<=9;i++){i_sum=0;for(int j=1;j<9;j++){cin>>s[i][j];i_sum+=s[i][j]; //第i行前j个数之和 sum[i][j]+=sum[i-1][j]+i_sum; //1,1到i,j矩形内的所有数之和 }} // cout<<sum[1][1]<<' '<<sum[4][4]<<' '<<sum[8][8]<<endl; // cout<<fun(n,1,1,8,8)<<endl;double result=n*fun(n,1,1,8,8)-sum[8][8]*sum[8][8];printf("%.3f\n",sqrt(result/(n*n)));return 0; }
转载于:https://www.cnblogs.com/ucandoit/p/8480392.html
DP--POJ1191 棋盘分割相关推荐
- POJ-1191 棋盘分割 动态规划
详见代码: #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath&g ...
- AcWing321.棋盘分割(区间DP)题解
棋盘分割 题目传送门 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘 ...
- 棋盘分割(记忆化搜索)
棋盘分割 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 老BOJ 16 棋盘分割
棋盘分割 Accept:46 Submit:186 Time Limit:1000MS Memory Limit:65536KB Description 将一个8*8的棋盘进行如下分割 ...
- 递归,记忆化搜索,(棋盘分割)
题目链接http://poj.org/problem?id=1191 Problem: 1191Memory: 568KTime: 16MSLanguage: C++Result: Accepted ...
- 棋盘分割(区间DP)
将一个 8×8 的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了 (n−1) 次后,连同最后剩下的矩形棋盘共有 n 块矩形棋盘.(每次切割都只能沿 ...
- pku 1191 棋盘分割 DP / 记忆化搜索
http://poj.org/problem?id=1191 题意:中文省略. 思路:黑说p116有讲解, 主要的状态转移方程为 横着切: dp[k][x1][y1][x2][y2] = min(d ...
- POJ 1191 棋盘分割(区间DP)题解
题意:中文题面 思路:不知道直接暴力枚举所有情况行不行... 我们可以把答案转化为 所以答案就是求xi2的最小值,那么我们可以直接用区间DP来写.设dp[x1][y1][x2][y2][k]为x1 y ...
- poj 1191 棋盘分割(记忆化dp+递归)
根据这2个公式可以 得到 O^2 = sum(x1^2 + x2^2 + x3^2 +...xi^2)/n - 平均值^2 所以我们就是要使得总分的平方和尽量小-- 对于一次切割,可以横着切,可以竖着 ...
- NOIP 好题推荐(DP+搜索+图论)POJ ZOJ
NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS) 1090 Chain ->格雷码和二进制码 ...
最新文章
- 第四范式冲刺IPO:4年亏13亿收入逐年翻番,研发工资人均2万
- Codeforces - 466C - Number of Ways - 组合数学
- java 打开gc日志_在运行时打开GC日志记录
- JS new操作符执行之后背后的操作
- 虚拟主机 webdav php,ubuntu 搭建 webdav 文件服务器 及客户端配置 详解
- vue 使用this.reload方法刷新页面配置
- 【snipaste下载和快捷键的修改】
- C# OpenXml组件
- android 清空剪贴板,清空剪贴板app
- 《那些年啊,那些事——一个程序员的奋斗史》——98
- 抽象类 枚举 反射 接口
- DTW学习(dynamic time warping)——思想、代码实现
- 数字孪生数字汽车风洞技术研究案例
- Android 微博登录
- 极海推出APM32A系列车规级MCU
- C语言教程-main函数
- shell脚本基础日常练习
- [RTL]W1C類型的Register是如何工作的
- 计算机突然需要管理者密码,为什么windows7旗舰版开启管理员帐号登录需要密码...
- SVN安全证书问题解决方案