【BZOJ1084】dp】的更多相关文章

题目很简单 分析蛮无聊的一道题.状态转移十分显然然后就做完了. #include <bits/stdc++.h>#define sc(n) scanf("%d",&n)#define pt(n) printf("%d\n",n)#define rep(i,a,b) for(int i=a;i<=b;i++)#define vi vector<int>#define vl vector<long long>#defin…
[BZOJ1084]最大子矩阵(动态规划) 题面 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767). 输出格式: 只有一行为k个子矩阵分值之和最大为多少. 输入输出样例 输入样例#1 3 2 2 1 -3 2 3 -2 3 输出样例#1 9 题解…
Apocalypse Someday Description The number 666 is considered to be the occult “number of the beast” and is a well used number in all major apocalypse themed blockbuster movies. However the number 666 can’t always be used in the script so numbers such…
[算法]区间DP [题意]平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖),n<=100. [题解]随机大数据下,贪心几乎没有错误,贪心出奇迹啊! f[i][j][h]表示区间i~j高度>=h的点全部被覆盖的最少矩形. 首先离散化横纵坐标,然后初始化每个f[i][i],然后进行区间DP(顺次枚举区间长度,左端点,高度从大到小)转移如下. f[i][j][h]=min(f[i][j][h],f[i][x][h]+f[x+1][j][h]),x=…
[题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少. [题解] 每条边的边权都是一次函数,那么直径是单峰函数.单峰函数求最小值我们可以用三分法. 注意边权可能为负数,求直径时要用DP,而不能用dfs到最远点.再从最远点dfs到它的最远点的方法. #include<cstdio> #include<cstring> #include&l…
{20160927 19:30~21:30} 总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了.不过,虽然时间花费的多,但我觉得我的PG也是“博采众长”了. ------------------------------------------------------------------------------------------------------------------------------…
题意 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. \(1≤n≤100,1≤m≤2,1≤k≤10\) 分析 由于\(m\)只有两个值,所以必然是分类讨论. 这里只考虑\(m=2\)的情况. 设\(f[i][j][k]\)表示第一列前\(i\)位,第二列前\(j\)位,使用了\(k\)个的最大值. \(f[i][j][k]=\max(f[i-1][j][k],f[i][j-1][k])\) \(f[i][j][k]=\max(…
知识储备:dp入门. 好了,完成了dp入门,我们可以做一些稍微不是那么裸的题了. ------------------------------------------------------------------------------------ 洛谷P1880 石子合并 分析:曾经的noi系列.石子合并问题分好几种情况. 这题是环形的,且只能合并相邻的两堆,那么我们把石子数组展开,如[1,2,3,4,5] -> [1,2,3,4,5,1,2,3,4,5],这样进行处理,就能将环形转换成直线…
动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先看看这段话 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了…
问题描述 : After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not mind which city being his start station because superman can bri…
序列双段最大子段和问题 (也许很水但蒟蒻刚刚学dp就来记录一下) 题目链接 题意就是求序列中的任意两段的最大子段和最大. 我们先预处理出来前缀和,方便求最大子段和. 对于每一个i都求一遍1到i的最大子段和,即: pre[1]=a[1]; minn=min(0,a[1]); for(int i=2;i<n;i++){ minn=min(minn,a[i]); pre[i]=max(pre[i-1],a[i]-minn); } 其中,a数组是前缀和,直接处理的. 那么,我们再对n到1的每一个i求一遍…
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1. 思路 动态规划 代码 class Solution { public int numWays(int n) { if(n==0) return 1; int[] ans = new int[n+1]; ans[0]=1; ans[1]=1; for(int i =2;i<=n;i++){ ans…
UPD:修了点锅(啊昨天居然写脑抽了) 题目内容 给定两个长度为 \(n\) 的序列,定义 \(magic(A,B)=\sum\limits_{i=1}^n \max(A_i,B_i)\). 现在给定 \(n,K\) 问有多少对 \((A,B)\) 满足 \(magic(A,B)\geq K\). 结果 \(\mathrm{mod}\ 998244353\). 思路 关于数据太水导致特判大法直接AC这件事重评了 关于两重排列,可以将 \(B\) 序列固定为 \(1.2.3\dots n\),最后…
[思路] dp[i][j]表示前i个数为第j种状态,考虑6种状态 0: 出现且仅出现 2 1: 出现且仅出现 2 0 2: 出现且仅出现 2 3 3: 出现且仅出现 2 0 1 4: 出现且仅出现 2 0 3 5: 出现且仅出现 2 0 1 3 [AC] #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include&l…
[题意] 给两个字符串s和p,判断s是否能用p进行匹配. [题解] dp[i][j]表示s的前i个是否能被p的前j个匹配. 首先可以分成3大类情况,我们先从简单的看起: (1)s[i - 1] = p[j - 1],易得dp[i][j] = dp[i-1][j-1] (2)p[i - 1] = '.',因为'.'可以匹配任何字符,所以dp[i][j] = dp[i-1][j-1] (3)p[i - 1] = '*',这种情况就比较复杂了. 当p[j - 2] != s[i - 1] &&…
[算法]DP+斜率优化 [题意]n(n≤50000)块土地,长ai宽bi,可分组购买,每组代价为max(ai)*max(bi),求最小代价. [题解] 斜率优化:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 因为对于土地x和y,若满足a[x]<=a[y]&&b[x]<=b[y],则x土地可无条件包含在y土地中,所以x土地可以忽略. 于是对长度从小到大排序,第二关键字对宽度从小到大排序,处理掉可被包…
[算法]DP+线段树求区间max(二维偏序) [题解] 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]. 观察j的条件限制显然是二维偏序求最大值,套路化地离散化后一维排序+一维线段树即可解决. 最后在f[i]中找max,所以不用恢复原序. 复杂度O(n log n). #include<cstdio> #include<cstring> #include<cctype> #include<…
[题意]给定只含小写字母的字符串,要求分割成若干段使段内字母重组顺序后能得到回文串,求最少分割段数.n<=2*10^5 [算法]DP [题解]关键在于快速判断一个字符子串是否合法,容易发现合法仅当不存在或只存在一个奇数字符,其余字符均为偶数. 当涉及到奇偶性(%2)时,很自然能想到异或. 将小写字母a~z转化2^0~2^25,那么一个字符子串合法当且仅当其连续异或值是0或2^i(0<=i<=25). 令f[i]表示前i个合法的最少段数,sum[i]表示异或前缀和,则有: f[i]=min…
[题意]给定一排n根杆高度hi,一个常数C,杆升高x的代价为x^2,相邻两杆之间架设电话线代价为高度差*C,求总代价最小. [算法]DP+辅助数组优化 [题解]令f[i][j]表示第i根杆高度为j的最小代价. f[i][j]=min(f[i-1][k]+C*|j-k|+(a[i]-j)^2).复杂度O(n*100*100). 考虑优化方向是省略k这一维的枚举,故分离方程中和k无关的变量. f[i][j]=min(f[i-1][k]-C*k)+C*j+(a[i]-j)^2,k<=j f[i][j]…
[题意]给定n道题,每月末发放工资m,要求从1解到n,每道题需要在当月初付费ai,下月初付费bi,多道题可以安排在同月,求最少月数. [算法]DP [题解]参考自:[bzoj1700]Problem Solving 解题 dp by GXZlegend 因为当月的选择同时关系着当月和下月,贪心是错误的,有如下反例: 50 5 40 10 10 40 10 5 10 3 10 2 因此考虑DP,令f[i][j]表示解决1~i题,最后一月解决j题的最小月数.(只保证满足当月开销,也就是下月开销之后再…
[算法]DP+数学优化 [题意]把n个1~m的数字分成k段,每段的价值为段内不同数字个数的平方,求最小总价值.n,m,ai<=40000 [题解] 参考自:WerKeyTom_FTD 令f[i]表示把前i个数分成若干段的最小价值. 转移中我们定义,从i开始往前到有j个不同的数的最小位置为b[j]. f[i]=f[b[j]-1]+j^2. 考虑最坏情况,每个数自成一段,则总价值为n. 所以当段内不同的数个数>√n时,就不可能是最优解了(此时价值>n). 所以f[i]=f[b[j]-1]+j…
[算法]DP||贪心 [题解] (1)动态规划: 令f[i][0..1]为两种条件下前i株花的最大保留数量,状态转移方程: f[i][0]=max(f[j][1]+1) (j=i-1...1)(h[i]>h[j]) f[i][1]=max(f[j][0]+1) (j=i-1...1)(h[i]<h[j]) 初始化:f[i][0]=f[i][1]=1,这样时间复杂度是O(n^2). 由于题目的数据范围中有一句话:所有的h_i随机生成,所有随机数服从某区间内的均匀分布. 所以加个优化,因为f[i]…
[算法]DP+数学计数 [题意]给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模): 1.每条边连接两个不同的点,每两个点之间至多有一条边. 2.不存在三个点a,b,c使三个点间两两可以互相到达且两两之间最短距离相等. 3.边的长度均为1. n<=2000 [题解] p[i]表示i个点形成联通块的满足条件的方案数. 如果i个点形成链,则一定是直链,如果有分支则一定不满足条件,如此有n!/2种方案(排列,正反算一种) 如果i个点形成环,则一定是i-1…
[算法]动态规划 [题解]DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移. 最优化问题中DP往往占据重要地位. f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶牛改为哪个编号的方案全部记录了,转移可以保证最优. 正反各做一次. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ],a[maxn]; int main() { s…
[算法]贪心 [题解] DP可以f[i][0],f[i][1]表示选了i分别满足条件AB的答案,其优化也是利用了下面的性质,不多赘述. 想象数列的波动,最大值一定是取每个波峰和每个波谷,那么只要O(n)统计就可以了. #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using n…
[算法]DP [题解]f[i][j][0]表示在i,j位置往下走的球数,f[i][j][1]表示在i,j位置往右走的球数,经过i,j的球若为-1则(num+1)/2往下,其余往右.+1类似. 转移见代码. #include<stdio.h> #include<cstring> #include<cctype> #include<algorithm> using namespace std; int read() { ,t=; ; +c-';}while(is…
[算法]DP #include<cstdio> #include<algorithm> using namespace std; ,maxn=; int f[maxn][maxn]; int mods(int x) {return x>MOD?x-MOD:x;} int main() { int n,m; scanf("%d%d",&n,&m); f[][]=; ;i<=n;i++) { ;j<=m;j++) { f[i][j]…
[算法]DP [题解]开long long…… #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ; int a[maxn],n; int main() { scanf("%d",&n); ,ans=,x; ;i<=n;i++) { scanf("%lld",&x); sum+=x; ans=max(ans,…
[算法]DP [题解]f1[i]表示第i棵树当前高度能得到的最多果子数 f2[i]表示高度i能得到的最多果子数. 于是有: f1[j]=max(f1[j],f2[i+delta])+mp[j][i]; f2[i]=max(f2[i],f1[j]); 注意i+delta的范围. #include<cstdio> #include<cctype> #include<algorithm> using namespace std; ; ],f2[maxn*],mp[maxn][…
[算法]DP+斜率优化 [题解]状态转移方程:f[i]=min(f[j]+g(i+1,j-1))+c[i] 关键在于如何O(1)计算g(i+1,j-1). 推导过程:http://blog.csdn.net/PoPoQQQ/article/details/40504949 当d(j,k)中j<k且k更优时,得到斜率不等式: (f[j]-f[k]+sumpx[j]-sumpx[k])/(sump[j]-sump[k])<x[i] 于是斜率优化. 斜率优化:http://www.cnblogs.c…