棋盘分割(二维区间DP)】的更多相关文章

题目大意:给一个棋盘,棋盘上每个格子中都有一个值,现在需要将棋盘切成n个矩形,总共切n-1刀,求最小的均方差.均方差定义为:,其中. 题目分析:将均方差化简得到:均方差2=(Σxi2)/n-平均值2.显然,平均值2是定值,为数字总和除以n.只需让矩形的和的平方和最小即可.先预处理出数组s(x1,y1,x2,y2),表示左上角为(x1,y1),右下角为(x2,y2)的矩形上数字和的平方,定义dp(k,x1,y1,x2,y2)表示将矩形(x1,y1,x2,y2)切k刀能获得k+1个矩形时各矩形上数字…
The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询 每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素 n <= 250 ,q <= 250000 , a[i][j]<=10000 思路:用到了主席树求区间第k小, 主席树本质是可持久化权值线段树,用区间[l,r]表示值在[l,r]间的数字有多少个 每插入一个数字,实际上只修改了log个区间,其他的部分不发生变化,所以只需要对修改的区间新开结点即可 求区间第k小…
http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的棋盘) 2.考虑如何计算方差,根据以下方差公式 我们只需算∑Xi  2的最小值//然后将它乘以n,减去总和的平方,除以n^2,再整体开根号就行了,化简一下的结果 3.关于棋盘的表示,我们用左上角坐标与右下角坐标,常规表示 4.关于计算优化,用sum二维前缀和.并且进行记忆化递归. 技巧:1&引用…
http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15655   Accepted: 5556 Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,…
package com.sxt.arrays.test; import java.util.Arrays; /* 1,2,3,4!5,6,7!8,9!12,456,90!32 * 将此字符串以叹号为分割存入二维数组中 * 知识点:字符串+数组 */ public class TestArray { public static void main(String[] args) { String s = "1,2,3,4!5,6,7!8,9!12,456,90!32"; String[]…
显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形的两个边界求一下原本的gcd即可. 但这样大概需要三个二维线段树,空间可能不太够.由于查询区域是由一个给定点拓展的,可以改为以该点为中心建差分矩阵,这样剩下部分是一个十字形,可以直接一维线段树维护,就只需要一个二维线段树了. 注意题面有锅,详见discuss,被坑了一年. #include<iost…
括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的   输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,…
背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅,有责任带领大家脱离危险! (若对情节有任何疑问,请观看原剧) 描述 歹徒告诉小杉,他正在寻找的拼图块其实可以拼成N个 有顺序的 完整的拼图. 每个完整的拼图由若干个拼图块组成. 歹徒要求小杉把拼图按拼出的顺序划分成M个集合,一个拼图集合由若干个完整的拼图组成,并且总的拼图块的数目不超过T.并且,构成集合的拼图…
旅游 [题目链接]旅游 [题目类型]DP &题解: 紫书P269 代码很简单,但思路很难.很难能想到要把一个圈分成2条线段,很难想到d(i,j)表示的是已经走过max(i,j)还需要的距离值,当然设d为还需要的距离值,这很常见. 还有也很难想到下一步只能走到i+1. [时间复杂度]O(n^2) &代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 0x3f…
题目描述:     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. 输入描述: 有多组测试数据,输入到文件结束. 每组测试数据第一行有一个整数n,表示有n堆石子. 接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出描述: 输出总代价的最小值,占单独的一行 样例输入: 3 1 2 3 7 13 7 8 16 21…