题解 P1436 【棋盘分割】
其实呢大致思路和下面的大佬们都很像。
发这篇题解的目的就是加了一点~~优化~~骗分技巧。
转移方程:
设$dp[i][j][x][y][k]$表示左上$(i,j)$,右下$(x,y)$,第$k$次割的最大面积。
则对于
$\sum_{k=1}^{n}$
开始更新,有:(~~一口气读完这个方程~~)
$\sum_{i=1}^{8} \sum_{j=1}^{8} \sum_{x=1}^{8} \sum_{y=1}^{8}$
$a=j……y-1;b=i……x-1;$
$dp[i][j][x][y][k]=$
$min($
$min(dp[i][j][x][a][k-1]+dp[i][a+1][x][y][0],dp[i][j][x][a][0]+dp[i][a+1][x][y][k-1]),$
$min(dp[i][j][b][y][k-1]+dp[b+1][j][x][y][0],dp[i][j][b][y][0]+dp[b+1][j][x][y][k-1])$
$);$
但是。
别以为推出了方程就万事大吉了!!!
您的边界条件呢(这题~~很简单~~)。
但是这题的初始化是重点!!!重点!!!重点!!!
好几篇都是6重循环暴力算的。
本宝宝:前缀和先求出来就好了。
那么好,初始化的话是要把所有左上为$(i,j)$右上为$(x,y)$,割了0次的面积求出来。这里,本宝宝用了一个前缀和的思想和容斥原理。
先在输入的时候就处理出来所有左上$(1,1)$右上$(i,j)$的得分(前缀和);
然后利用容斥原理(具体见代码)
能少些~~三~~两个循环呢。。。
上代码(码风不好请原谅)
- //by Su Qingnian
- //QAQ
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- int n;//n是总共切的刀数
- int map[][];//存图,价值
- int sum[][];//前缀和数组
- int dp[][][][][];//dp暴力数组
- inline void add(int i,int j)
- {
- //这个函数是计算前缀和数组。左上(1,1)右下(i,j)的价值
- //好好想想为什么。(扩展这个点时左边矩形+右边矩形-重叠的部分+这个点的价值)
- sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-]+map[i][j];
- return ;
- }
- inline int s(int x1,int y1,int x2,int y2)
- {
- //这个是用来计算左上(x1,y1)右下(x2,y2)的价值
- //还是容斥原理
- int now=sum[x2][y2]-sum[x2][y1-]-sum[x1-][y2]+sum[x1-][y1-];
- return now;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=;i++)
- for(int j=;j<=;j++)
- scanf("%d",&map[i][j]),
- add(i,j);//输入,处理前缀和
- //debug
- // for(int i=1;i<=8;i++,puts(""))
- // for(int j=1;j<=8;j++)
- // printf("%-5d ",sum[i][j]);
- //处理切0刀时各矩形价值的平方
- for(int i=;i<=;i++)
- for(int j=;j<=;j++)
- for(int x=i;x<=;x++)
- for(int y=j;y<=;y++)
- dp[i][j][x][y][]+=s(i,j,x,y),
- dp[i][j][x][y][]*=dp[i][j][x][y][];
- //dp过程,深吸一口气读完这一面方程。
- for(int k=;k<n;k++)
- for(int i=;i<=;i++)
- for(int j=;j<=;j++)
- for(int x=i;x<=;x++)
- for(int y=j;y<=;y++)
- {
- int minn=0x3f3f3f3f;
- for(int a=j;a<y;a++)
- minn=min(minn,min(dp[i][j][x][a][k-]+dp[i][a+][x][y][],dp[i][j][x][a][]+dp[i][a+][x][y][k-]));
- for(int b=i;b<x;b++)
- minn=min(minn,min(dp[i][j][b][y][k-]+dp[b+][j][x][y][],dp[i][j][b][y][]+dp[b+][j][x][y][k-]));
- dp[i][j][x][y][k]=minn;
- }
- printf("%d",dp[][][][][n-]);
- //输出,程序拜拜。
- return ;
- }
题解 P1436 【棋盘分割】的更多相关文章
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- 【Luogu】P1436 棋盘分割 题解
嗯,点开题目,哇!是一道闪亮亮的蓝题! 不要被吓到了,其实,这道题就是一个简单的DP啦! 我们设 \(f[x1][y1][x2][y2][c]\) 为以 \((x1,y1)\) 为左上角,以 \((x ...
- P1436 棋盘分割[dp]
题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...
- 洛谷P1436 棋盘分割
洛谷题目链接 动态规划: 我们设状态$f[i][j][o][p][k]$表示一个矩形,左上角顶点坐标为$(i,j)$,右下角顶点坐标为$(o,p)$时分割了$k$次,也就是说现在是$k+1$块 我们考 ...
- Luogu P1436 棋盘分割 暴力DP
我的天,,,,,n=8,k<=15,,,这怕不是暴力DP+高维数组.... 开一个五维数组f[k][i][j][p][q]表示从(i,j)到(p,q)中分成k个矩形最小的平方和. 然后初始化时用 ...
- [POJ] 1191 [LUOGU] P1436 棋盘分割
那个均方差,可以通过展开.合并Σ,发现最终只有Xi^2会对答案造成影响,其他都是定值,所以求出最小的和的平方就行. 其实这才是这题最难的部分,以下都是码农部分. f[x1][y1][x2][y2][k ...
- POJ1991 NOI1999棋盘分割
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15581 Accepted: 5534 Description ...
- POJ 1191 棋盘分割
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11213 Accepted: 3951 Description 将一个 ...
- poj 1191 棋盘分割 动态规划
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11457 Accepted: 4032 Description ...
- NOI 193棋盘分割.cpp
193:棋盘分割 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分 ...
随机推荐
- java-虚拟机-索引
底层 JVM之堆内存(年经代,老年代) Java内存泄露的理解与解决 内存溢出和内存泄漏的区别.产生原因以及解决方案 JVM内容梳理 Jvm的体系结构
- Windows nvidia显卡的设置方法
1.直接右下角打开N卡控制面板托盘按钮,一般来说都是自动隐藏在小箭头里的,点开就可以显示隐藏的图标了.[插入图片“右下角小箭头”]2.开始菜单 - 控制面板 ,可以看到“显卡控制面板”这个选项,进去就 ...
- Linux下zip格式文件的解压缩和压缩
Linux下zip格式文件的解压缩和压缩 Linux下的软件包很多都是压缩包,软件的安装就是解压缩对应的压缩包.所以,就需要熟练使用常用的压缩命令和解压缩命令.最常用的压缩格式有.tar.gz/tgz ...
- 01 asp.net编程笔记
1.asp.net 获取当前网址url 参考地址:http://www.cnblogs.com/190196539/archive/2011/12/13/2286072.html 设当前页完整地址是: ...
- ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\WWFDATA.dbf'
错误提示如下图: ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\DB_DATA\SEINESCMDB\WWFDATA_DATA01.dbf' 分析原因及解决方法: 1.查看 ...
- Hadoop之HDFS(一)HDFS入门及基本Shell命令操作
1 . HDFS 基本概念 1.1 HDFS 介绍 HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统.是 Hadoop 核心组件之 ...
- git配置多用户多平台
在Git使用中经常会碰到多用户问题,例如:你在公司里有一个git账户,在github上有一个账户,并且你想在一台电脑上同时对这两个git账户进行操作,此时就需要进行git多用户配置. 首先配置不同的S ...
- 【bzoj2460】[BeiJing2011]元素
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 692 Solved: 372[Submit][Statu ...
- 10、差异基因topGO富集
参考:http://www.biotrainee.com/thread-558-1-1.html http://bioconductor.org/packages/3.7/bioc/ http://w ...
- 2.8.2 并发下的ArrayList,以及源码分析
package 第二章.并发下的ArrayList; import java.util.ArrayList;import java.util.List; /** * Created by zzq on ...