poj 1191 棋盘切割 (压缩dp+记忆化搜索)
一,题意:
中文题
二。分析:
主要利用压缩dp与记忆化搜索思想
三,代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
const int Big=20000000;
int Mat[10][10];
int N;
int sum[10][10];
int dp[20][10][10][10][10];
void unit()
{//求和用sum[i][j]表示ij到左上角的和
int total;
for(int i=1; i<=8; i++)
for(int j=1; j<=8; j++)
{
total=Mat[i][j];
int x_1,y_1;
x_1=i-1;
y_1=j-1;
if(x_1>0)
total+=sum[x_1][j];
if(y_1>0)
total+=sum[i][y_1];
if(x_1>0&&y_1>0)
total-=sum[x_1][y_1];
sum[i][j]=total;
}
} int account(int x_1,int y_1,int x_2,int y_2)
{//求(x_1,y_1)到(x_2。y_2)区间和
int total=sum[x_2][y_2];
int x_3,y_3;
x_3=x_1-1;
y_3=y_1-1;
if(x_3>0)
total-=sum[x_3][y_2];
if(y_3>0)
total-=sum[x_2][y_3];
if(x_3>0&&y_3>0)
total+=sum[x_3][y_3];
return total*total;
} int solve(int k,int x_1,int y_1,int x_2,int y_2)
{//记忆化dp
if(dp[k][x_1][y_1][x_2][y_2]!=-1)
return dp[k][x_1][y_1][x_2][y_2];
if(k==1)
return dp[k][x_1][y_1][x_2][y_2]=account(x_1,y_1,x_2,y_2);
if(k>1)
{
int Min=Big;
for(int i=y_1;i<y_2;i++)
{//横向分割
int first=account(x_1,y_1,x_2,i);
int second=account(x_1,i+1,x_2,y_2);
first+=solve(k-1,x_1,i+1,x_2,y_2);
second+=solve(k-1,x_1,y_1,x_2,i);
if(first>second)
first=second;
if(Min>first)
Min=first;
}
for(int j=x_1;j<x_2;j++)
{//纵向分割
int first=account(x_1,y_1,j,y_2);
int second=account(j+1,y_1,x_2,y_2);
first+=solve(k-1,j+1,y_1,x_2,y_2);
second+=solve(k-1,x_1,y_1,j,y_2);
if(first>second)
first=second;
if(Min>first)
Min=first;
}
return dp[k][x_1][y_1][x_2][y_2]=Min;
}
return dp[k][x_1][y_1][x_2][y_2]=Big;
} int main()
{
while(scanf("%d",&N)!=EOF)
{
double total=0.0;
for(int i=1; i<=8; i++)
for(int j=1; j<=8; j++)
{
scanf("%d",&Mat[i][j]);
total+=Mat[i][j];
}
unit();
memset(dp,-1,sizeof(dp));
total=(total/N)*(total/N);
double key=solve(N,1,1,8,8);
key=key/N;
key=sqrt(key-total);
printf("%0.3f\n",key);
}
return 0;
}
poj 1191 棋盘切割 (压缩dp+记忆化搜索)的更多相关文章
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- poj - 1191 - 棋盘切割(dp)
题意:将一个8*8的棋盘(每一个单元正方形有个分值)沿直线(竖或横)割掉一块,留下一块,对留下的这块继续这样操作,总共进行n - 1次,得到n块(1 < n < 15)矩形,每一个矩形的分 ...
- poj 1088 滑雪(区间dp+记忆化搜索)
题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...
- POJ 1088: 滑雪(经典 DP+记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74996 Accepted: 27818 Description ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
随机推荐
- Top 22 Free Responsive HTML5 Admin & Dashboard Templates 2018
Top 22 Free Responsive HTML5 Admin & Dashboard Templates 2018 May 18, 2018 Alex Ivanovs Website ...
- Dynamics CRM2013/2015 插件注冊工具登录后无法显示assembly列表问题的解决的方法
自微软从2013版本号推出新的插件注冊器后,随着UI的重大更新后,问题也多了非常多.前面已有博客提到注冊assembly时看不到注冊button(http://blog.csdn.net/vic022 ...
- js01----json,数组
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Scott Hanselman的问题-3
.Net程序员面试 中级篇 (回答Scott Hanselman的问题) 继<.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)>跟<.Net程序员 ...
- BFC的布局规则和触发条件
1 .BFC的含义 : Block Formatting Contexts(BFC) 块级元素格式化上下 ...
- assert增强宏的实现
作者:朱金灿 来源:http://blog.csdn.net/clever101 标准c的assert宏和MFC的ASSERT宏都不支持输出太多的信息.今天实现了一个assert增强宏,可以输出更多的 ...
- postgresql sql语句 更改表名
SELECT'alter table "public"."'|| t.tablename||'"'||' rename to "'|| "l ...
- storm排错
1.运行错误如下 Exception in thread "main" java.lang.RuntimeException: org.apache.thrift7.transpo ...
- 执行异步UI更新
异步更新UI的几种方法①.使用Control.Invoke方式来更新数据 foreach (DataGridViewRow dgvr in this.dgv_s ...
- hive学习笔记-高级查询
聚合函数 count计数 count(*):不全都是NULL.就加1:count(1):当仅仅要有一列是NULL就不会加1:count(col):当col列不为空就会加1 sum求和 sum(可转成数 ...