
动态规划
文章平均质量分 76
SimpleLifeT_T
github账号:lihongqiang
展开
-
最大字段和模版(二维)
#include#define maxn 105#define INF 0x7fffffffusing namespace std;int a[maxn][maxn];int b[maxn];int n;int fun1(){ int ret=-INF,k=0; for(int i=1; i<=n; i++) { if(k>0)原创 2013-07-14 11:26:01 · 684 阅读 · 0 评论 -
Regionals 2010, Asia - Kuala Lumpur
C题:Scientefic Experiment题意:让你走进一个建筑扔鸡蛋,测试鸡蛋的硬度,即求出在哪层扔开始碎。进入建筑需要花费y元(不带鸡蛋),花费z元(带鸡蛋),在建筑里买鸡蛋需要花费x元。开始一直没搞清楚题意,第一组和第二组样例出的时候,都是根据二分的思想来做的,不过对于后面的样例就不适用了。在看了xl的代码后,想到要枚举最后一次测试的层数,并且利用动态规划来搞。f[i]原创 2013-09-19 19:13:53 · 663 阅读 · 0 评论 -
组队赛131004 Regionals 2010, North America - East Central NA
F:比较裸的泛化背包吧,比赛的时候没有时间敲了,赛后发现比较水,不过还是有那么几组数据一致过不了。最后发现是顺序问题,得满足条件尽量使前面的最多,那么只能从后向前,每次求出当前点最多能达到的最大值。dp[i][j]表示从i到n这些点,取j的容量,能达到的最大值,并且满足i是取最大。代码:#include#include#include#include#include#in原创 2013-10-04 23:27:31 · 904 阅读 · 0 评论 -
hdu1074 状压dp
#include#include#include#include#include#define maxn 10005#define INF 10000000using namespace std;struct node{ string s; int d,c;}a[22];struct dpp{ int pre;//前一个状态 int now_原创 2013-10-04 10:25:04 · 843 阅读 · 0 评论 -
hdu1158
#include#include#include#define maxn 1000005#define INF 0x7fffffffusing namespace std;int a[22],dp[22][22222];int main(){ int n,h,s,f; while(scanf("%d",&n)!=EOF) { if(!n) b原创 2013-10-03 21:37:20 · 721 阅读 · 0 评论 -
hdu1024
#include#include#include#define maxn 1000005#define INF 99999999using namespace std;int a[maxn],dp[maxn],dp_max[maxn];int n,m;int main(){ while(scanf("%d%d",&m,&n)!=EOF) { for原创 2013-10-03 10:47:06 · 880 阅读 · 0 评论 -
poj2528 线段树 区间更新+染色+离散化
这题是我做区间更新离散化的第一题呀,对离散化的应用有了一定了了解,然后染色是区间更新另一种应用,最主要的是对col数组的处理。先介绍最普通的离散化:把可能出现的所有点排序,然后将该点再数组中的位置作为该点新的值。用到stl包括:sort(a,a+n),low_bound(a,a+n,a[i]),unique(a,a+k)注意一下就是1.先排序,在去重。2.要及时更新数组的大原创 2013-08-29 14:40:11 · 676 阅读 · 0 评论 -
hdu4588前缀 分区间计算
这题和上次做的Uva11361和相似,也是区间查询,利用前缀数组来存,结果为a[r]-a[l-1]。这题注意转化为求每一位的1的个数和。代码:#include#include#include#include#define ll __int64using namespace std;//ll a[66];//void fun(int x,ll* a)//{//原创 2013-08-17 21:52:23 · 966 阅读 · 2 评论 -
Uva11361 前缀 分区间
这题用的是书上给的思路,不过,对于这种类型的题,做的太少,于是打算好好谢谢。不过,花了一个晚上,参考别人的代码写了遍。这种类型的题一般都会用到前缀,设f(n)表示从1到n满足条件的数的个数。但是直接枚举,复杂度为O(n),但是由于范围最大能达到2^31左右,所以不能暴搞。这里将一个数分成几部分来算:f[d][m1][m2]表示数的位数是d,各位数的和模k为m1,该数模k为m2的数字的个原创 2013-08-16 21:18:41 · 673 阅读 · 0 评论 -
BNU29034 求期望的dp
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29034求概率的dp。代码:#include#include#include#include#include#include#include#include#define maxn 1005#define ll long longusing namespace std;原创 2013-08-28 14:56:23 · 812 阅读 · 0 评论 -
BNU29036 状压dp
http://www.bnuoj.com/bnuoj/contest_show.php?cid=2377#problem/26458用集合保存已经走过的状态。代码:#include#include#include#include#include#include#include#include#define maxn 22#define ll long longusi原创 2013-08-28 14:51:10 · 906 阅读 · 0 评论 -
hdu4681前缀+后缀最长公共子序列
#include#include#include#include#include#include#define maxn 1005#define INF 0xfffffff#define rep0(i,n) for(int i=0;i<n;i++)#define rep1(i,n) for(int i=1;i<=n;i++)#define mem(a,b) memset(a,b原创 2013-08-15 20:16:00 · 1005 阅读 · 0 评论 -
hdu 4669 开二维数组记录结尾点和余数求整除问题
#include#include#define maxn 50005#define maxm 205#define INF 0xfffffffint number[maxn],digits[maxn];int count[maxn][maxm],e[3*maxn];int n,mod;void init(){ memset(count,0,sizeof(int)*n*ma原创 2013-08-13 22:16:03 · 956 阅读 · 6 评论 -
hdu1443
比较奇怪的约瑟夫问题,一开始想到的之后最初始的O(mn)的模拟算法,不过这题得枚举所有的m,直到找到合适的,打了下标,13的时候跑了很久,因为答案达到了2500000左右。以前做的约瑟夫问题,一般是只要找最后一个或两个,如果两个的话就用两个变量,只循环n-2次。这题也是模拟吧,不过处理的比较好,sum每次只要减1,而且是累加m-1,至于为什么,看代码里面的注释吧,如果还搞不懂,只好多想想了。这原创 2013-08-13 10:29:39 · 928 阅读 · 0 评论 -
poj2211 约瑟夫问题变形 递归法
这题和约瑟夫问题差不多,只是得重新找子状态与原状态的编号的关系。jos(n,k)表示有n个人,没k个人杀一个人,最后杀的人的编号。(1-n)jos(n,k)=jos(n-n/k,k)+(jos(n-n/k)-1)/(k-1);试想一下,当前状态为jos(n,k),删一次之后可以看做从1重新开始,只是减少了n/k个人,令x=jos(n-n/k,k)。编号相差了(x-1)/(k-1)。当前原创 2013-08-12 17:21:03 · 911 阅读 · 0 评论 -
约瑟夫问题
转载:http://www.cnblogs.com/woodfish1988/archive/2007/02/18/652251.html约瑟夫环数学解法无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百 万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出原创 2013-08-12 16:02:45 · 645 阅读 · 0 评论 -
poj2244 约瑟夫问题变形
这题只改变的起点吧,套公式直接出。#include#include#include#include#include#include#define maxn 2005#define INF 0xfffffffusing namespace std;int check(int n,int m){ int l=0; for(int i=2;i<=n;i++)原创 2013-08-12 18:52:46 · 745 阅读 · 0 评论 -
La3485 利用自适应辛普森公式 求积分的和
#include#include#include#include#include#include#include#define maxn 10005#define INF 0xfffffff#define mem(a,b) memset(a,b,sizeof(a))#define FOR(i,s,t) for(int i=s;i<=t;i++)#define ull unsi原创 2013-08-23 13:57:16 · 1730 阅读 · 1 评论 -
hdu1227
#include#include#include#include#include#define maxn 100005#define INF 1000000using namespace std;int dp[222][222];int a[222];int get_cost(int now,int pre){ int mid=(now+pre)/2; int原创 2013-10-05 11:06:03 · 871 阅读 · 0 评论 -
hdu3008 DP
//hdu3008#include#include#includeusing namespace std;int a[111],b[111];int dp[111][111];void output(){ for(int i=0;i<=100;i++) { for(int j=0;j<=100;j++) { i原创 2013-10-06 10:21:08 · 1020 阅读 · 0 评论 -
状态压缩
你想知道它有多少种密码排列方式么? (上图是九宫格点对应的编号)用手指依次划过九宫格中的几个点,从而构成一个图案,将这个图案作为开机的密码。每个点最多使用一次,手指可以水平,竖直或者倾斜移动,但是不可以跳过未使用过的点。如果按编号对应的话,右图中的密码是147896325.另外,1524, 1832,5912是可以接受的,而1952是不能接受的。1234与1423是不同的方案原创 2012-12-12 20:24:21 · 406 阅读 · 0 评论 -
dp四边形优化
一、四边形不等式基本理论在动态规划的转移方程中,常见这样一种转移方程:这两个定理证明在赵爽的《动态规划加速原理之四边形不等式》中给出了相关的证明。二、四边形定理的应用1、poj1160 题目大意:给定n个城市,在m个城市里建邮局,使所有城市到最近邮局的距离和最小。很容易得到这样的方程:dp(i,j)=min(dp(i-1,k)转载 2014-10-18 16:19:28 · 743 阅读 · 0 评论 -
poj2096概率dp 递推法
dp[i][j]表示对应bug1和bug2分别为i,j的状态,到达n,s状态的时间期望。dp[i][j]=p1*dp[i][j]+p2*dp[i+1][j]+p3*dp[i][j+1]+p4*dp[i+1][j+1];p1,p2,p3,p4对应各种状态的概率。 最后还得把dp[i][j]解出来。代码:#include#include#include#include#in原创 2013-07-22 22:47:32 · 603 阅读 · 0 评论 -
131023 Regionals 2010, Asia - Jakarta
G题:组合加dp的题吧,给你一些数,让你求这些数可以组成的所有数的和。直接枚举每个数所在的位置,然后计算当前状态其他数可以构成的排列数,因为该数可能是最高位,也可能不是,所以得按长度求排列数,从最高位开始,注意每次要把前面的累加到后面,因为当前位可以不是最高位:dp[j-1]=dp[j-1]+dp[j];求长度的状态转移方程:dp[i][j+k]=sum{dp[i-1][j]*c[j+原创 2013-10-23 08:54:22 · 615 阅读 · 0 评论 -
单调队列优化专题
poj1821:这题是一道比较典型的队列优化问题吧,状态方程如下:dp[i][j]=max(max{dp[i-1][k]+(j-k)*a[i].p},dp[i-1][j],dp[i][j-1]}; 第i个人不刷,第i个人刷:第j面墙不刷,枚举所有可能结尾的墙dp[i][j]表示前i个人刷前j面墙的最大值,且第j面墙必须刷。这题第一勇到了双端队列deque,学习了不少东东啦。代码:原创 2013-10-20 21:15:16 · 772 阅读 · 0 评论 -
hdu 4374 单调队列优化dp
#include#include#include#include#define INF 0x7fffffffusing namespace std;int n,m,x,t;int sum[105][10005];void input(){ int x; for(int i=1; i<=n; i++) { sum[i][0]=0;原创 2013-10-21 09:59:19 · 777 阅读 · 0 评论 -
数位dp专题
首先推荐一个大神的博客:http://blog.youkuaiyun.com/liuqiyao_01/article/details/9109419原创 2013-10-21 10:17:32 · 610 阅读 · 1 评论 -
poj1821 单调队列优化
//poj1821#include#include#include#include#include#define INF 0x7fffffffusing namespace std;struct node{ int L,P,S;} a[222];bool cmp(node x,node y){ return x.S<y.S;}int n,k;int d原创 2013-10-20 21:13:32 · 850 阅读 · 0 评论 -
hdu2262
#include#include#include#include#include#include#define eps 1e-8#define maxn 226using namespace std;char s[22][22];int n,m;int cnt;struct node{ int x,y; node(){}; node(int xx,原创 2013-10-18 11:14:10 · 1408 阅读 · 1 评论 -
131014 Regionals 2010, North America - Mid-Atlantic USA
H题:这题是一个变形的背包问题,注意两点:1.数组开dp[2][],记录前一转态和后一个状态,否则超内存。2.求最小值,这样能节省时间。代码:#include#include#define maxn 1005#define maxf 20005#define INF 1000000using namespace std;int n,k,l,F;int f[maxn原创 2013-10-16 11:26:26 · 611 阅读 · 0 评论 -
Uva5933 队列优化
这题每次求的时候必须在满足条件的情况中选,明显是队列优化的模型,如果枚举所有情况,tle不解释。代码:#include#include#include#include#include#define ll __int64#define eps 1e-10#define maxn 305#define L ((1<<22)+1)using namespace std;i原创 2013-10-12 16:32:43 · 578 阅读 · 0 评论 -
hdu1503
#include#include#include#include#include#define ll __int64#define eps 1e-10#define maxn 305using namespace std;char s1[maxn],s2[maxn];int len1,len2;int dp[maxn][maxn],path[maxn][maxn];int原创 2013-10-12 10:47:52 · 916 阅读 · 0 评论 -
杭电动态规划23题
1.:http://acm.hdu.edu.cn/showproblem.php?pid=2955这题傻逼的认为了是裸地01背包,正确的动态方程:dp[i]=dp[i-v[i]]*(1-p[i]); dp[i]表示抢i元最大的不被抓到的概率。应为这题每次抢都是相互独立的,所以可以相乘,必须是不被抓到的概率相乘。代码:http://blog.youkuaiyun.com/qq415200973/arti原创 2013-09-23 22:34:12 · 927 阅读 · 2 评论 -
hdu1864 水dp
#include#include#include#include#include#include#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define maxn 100005#define INF 0xfffffff#define mem(a,b) memset(a,b,sizeof(a原创 2013-09-23 21:35:25 · 1024 阅读 · 0 评论 -
hdu2955 01背包变形
//hdu2955#include#include#include#include#include#include#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define maxn 100005#define INF 0xfffffff#define mem(a,b) memset(a,原创 2013-09-23 20:51:00 · 797 阅读 · 0 评论 -
组队赛131005 Southwestern Europe Regional, SWERC 2010
H:这题dp得开三维的,开始我只开了二维,每次只能取某个区间的最小值,还得记录最后化成一个字符的那个字符,所以总共开三维。代码:#include#include#include#includeusing namespace std;mapmp;struct node{ int cost; char c;}f[33][33];char原创 2013-10-05 21:17:07 · 799 阅读 · 0 评论 -
hdu1502
import java.math.BigInteger;import java.util.Scanner;public class Main { static int n; static BigInteger dp[][][]=new BigInteger [66][66][66]; public static void init(){ for(int j=0;j<=原创 2013-10-07 11:56:11 · 796 阅读 · 0 评论 -
LA4256 离散+超级汇点 通过连边转移状态
题意:求是得序列中任意两个相邻数或者相同或者对应图中的两个相邻的节点。这题一开始写一直WA,用的状态转移方程没有离散点,点都在集合内。开始的思想:dp[i][j]:表示第i个点是j,前i个点更改的最小次数。d[i][j]=min{dp[i-1][k]+(a[i-1]==j?0:1)|(j,k)是图中相邻的两个节点};这里的思路有一个BUG,就是最终答案不一定是以a[n]结尾,即原创 2013-08-19 22:22:18 · 758 阅读 · 0 评论 -
Uva11584 最少回文串
这题写了个O(n^4)的算法,被T了,后来改成O(n^2)的。开始一想到的思路就是区间dp搞:dp[i][j]=min(dp[i][k-1]+dp[k][s]+dp[s+1][j]}(k,s)是一个回文串这里枚举所有的i,j要o(n^2),然后还得找区间里所有的回文串,又是O(n^2),直接爆掉。其实以前做过很多这样的题,大多都降维。只要化成线性的就好搞了:dp[i]表示从原创 2013-08-19 16:50:00 · 625 阅读 · 0 评论 -
用单调队列优化的题目 我要长高
http://www.acm.uestc.edu.cn/problem.php?pid=1685我要长高Description韩父有N个儿子,分别是韩一,韩二…韩N。由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万。舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参原创 2013-07-14 17:35:58 · 1738 阅读 · 0 评论