
动态规划
azheng51714
欢迎加入 老生畅坛 微信公众号
展开
-
hdu 4558 剑侠情缘
#include#include#include#includeusing namespace std;const int maxn=500;const int mod=1e9+7;int t,n,m,a[maxn][maxn];int res,dp[maxn][maxn][12][2];char map[maxn][maxn];/*我们定义:dp[i][j][key][0原创 2013-06-04 21:17:22 · 1065 阅读 · 1 评论 -
hdu 2870 最大子矩阵 单调队列优化+dp
#include#include#include#includeusing namespace std;const int maxn=1002;int n,m,t,ans,cas=1;int h[maxn][maxn];///h[i,j]为点(i,j)对应的悬线的长度。int l[maxn];///l[i,j]为点(i,j)对应的悬线向左最多能够移动到的位置。int r[maxn原创 2013-01-15 16:28:47 · 547 阅读 · 0 评论 -
hdu 1505 最大子矩阵
#include#include#include#includeusing namespace std;const int maxn=1002;int n,m,t,ans,cas=1;int h[maxn][maxn];///h[i,j]为点(i,j)对应的悬线的长度。int l[maxn];///l[i,j]为点(i,j)对应的悬线向左最多能够移动到的位置。int r[maxn原创 2013-01-15 16:20:26 · 446 阅读 · 0 评论 -
poj 3017 单调队列+dp+sbt
/*题意: 将长度为n的序列分成若干段,使每段之和不大于m,且使各段中最大值之和最小,输出该值。解法: 由于n巨大,所以想到了滚动数组优化!*/#include#include#include#include#includeusing namespace std;const int maxn=111111;int q[maxn],a[maxn],n;long原创 2013-01-15 13:06:03 · 575 阅读 · 0 评论 -
hdu 1513 滚动数组优化 回文串
顺便贴一下LCS的图解算法 s1:2 5 7 9 3 1 2 s2:3 5 3 2 8一. 使用二維陣列二. 記錄每一格的結果,是由哪一格而來1. 陣列開頭均設為空2. S1[i]=S2[j]相同,dp[i][j]则继承左上方向dp[i-1][j-1]的值+13. 不相同dp[i][j]则继承 上方與左方中的最大數原创 2013-01-15 09:56:50 · 486 阅读 · 0 评论 -
hdu 区间dp 2476
#include#include#include#includeusing namespace std;const int INF=1<<29;const int maxn=102;int dp[maxn][maxn],ans[maxn];char s1[maxn],s2[maxn];int main(){ // freopen("//media/学习/ACM/input原创 2013-01-26 21:22:56 · 758 阅读 · 0 评论 -
poj 2955 区间dp 最大括号匹配数
/* 经典的区间DP模型--最大括号匹配数。 如果找到一对匹配的括号[xxx]oooo,就把区间分成两部分,一部分是xxx,一部分是ooo,然后以此递归直到区间长度为1或者为2.*/#include#include#include#includeusing namespace std;const int maxn=1002;char s[maxn];int dp[maxn][原创 2013-01-26 11:13:18 · 2449 阅读 · 0 评论 -
hdu 4433 字符串变化 DP
题目:给出两个串,每次可以选择连续的1-3个数字,进行同时加1或者同时减1,问最少经过多少次操作,将一个串转变为另外一个串解法: dp[i][j][k]表示 前i个已经完全匹配,而这时候,第i+1个已经加了j位,第i+2位已经加了k转移分为两步,枚举加,枚举减/*题目:给出两个串,每次可以选择连续的1-3个数字,进行同时加1或者同时减1,问最少经过多少次操原创 2013-01-26 09:59:11 · 647 阅读 · 0 评论 -
poj 3974 史上最NB 求最长回文子串 O(N) Manacher算法
/* Manacher算法--O(n)回文子串算法 OTL(好牛B的算法啊) O(n)求最长回文子串 p[i]-1为新串以str[i]为中心的最大回文长度,以#为中心则回文串长度为偶数,否则为奇数*/#include #include #include #include #define Maxn 1000100using namespace std;char原创 2013-01-24 14:38:12 · 1062 阅读 · 0 评论 -
hdu 2993 斜率优化 dp 入门学习
题意:给你一段长度为n的数列, 求其长度不小于 K 的平均值最大的子串。解析:抄的解析http://www.docin.com/p-469236754.html 例二[分析]简单的枚举算法可以这样描述:每次枚举一对满足条件的(a, b),即a≤b-F+1,检查ave(a, b),并更新当前最大值。然而这题中N很大,N2的枚举算法显然不能使用,但是能不能优化一下这个效原创 2012-11-23 14:52:20 · 730 阅读 · 0 评论 -
hdu 3507 斜率优化dp 入门学习
我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i]的形式,其中f[j]中保存了只与j相关的量。这样的DP方程我们可以用单调队列进行优化,从而使得O(n^2)的复杂度降到O(n)。 可是并不是所有的方程都可以转化成上面的形式,举个例子:dp[i]=dp[j]+(x[i]-x[j])*(x[i]-x[j])。如果把右边的乘法化开的话,会得到x[i]*x[j]的项。这就没办法原创 2012-11-22 21:21:55 · 2451 阅读 · 4 评论 -
Codeforces #2B B. The least round way
#include 第四题:这题求一条路径上的数,使得这些数相乘后后边的0的个数最少分析:这题一看就是DP问题,但是需要数学的一点分析,当时我一看就吓到了(数学弱渣T_T),然后去做E题了对于表格中有0的情况,答案最多为1,路径便是通过这个点的路径;或者为0;咱们先抛弃这种情况不谈,把0当作10处理 #include #include #include #include #inclu原创 2012-11-29 17:33:01 · 1395 阅读 · 0 评论 -
poj 3229 简单 TSP 状态压缩dp
/*有n个城市,规定m个城市必须去,从起点出发返回起点,在规定时间内,求能经过的最大城市数每到一个城市要休息a[i]时间 ,先floyd求得个点的最短距离,然后状态压缩DP 求一个类似汉密尔顿回路*/#include#include#include#includeusing namespace std;const double INF=1e9;int n,m原创 2012-11-09 15:18:42 · 1870 阅读 · 0 评论 -
zoj 3551 简单 概论dp
/*根据题意,每天只能增加一个Bloodsucker,也就是说n-1个正常人是一个接着一个变成Bloodsucker的,那么所有正常人变成Bloodsucker的天数期望等于所有正常人变成Bloodsucker的天数期望之和。考虑n-1个正常人中第i个变成Bloodsucker的正常人的转变概率为:P[i] = p*i*(n-i)/(n*(n-1)/2);则 E[i]=1/p[i];原创 2012-11-08 20:59:38 · 523 阅读 · 0 评论 -
hdu 3835 简单概率dp
R(N)Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 3 Accepted Submission(s) : 1Problem DescriptionWe know that some positive in原创 2012-11-07 20:44:51 · 522 阅读 · 0 评论 -
hdu 4044 GeoDefense 树形dp+分组背包
/*题意: 一棵树(编号1-n),1是敌人出口(只有一个敌人)。叶子节点是我军。在节点处装大炮。每个节点有 k 种大炮选择,可是每个节点最多装一个大炮。每个大炮有一个花费和一个威力值。你一共有m钱,怎么能使威力值最大。敌人去攻击哪个我军是任意的,所以最大威力是每条路值和的最小值。大炮放在叶子节点也是管用的。思路: 每个节点所能得到的power应该去儿子节点的最小值,原创 2012-11-06 14:35:18 · 758 阅读 · 0 评论 -
poj 2576 简单 二维背包
题目要求:n个人,每个人体重x[i],让你把他们分成两组,两组之间的人数差不能大于1。输出两组体重差最小的情况Tug of WarTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 7419 Accepted: 1956Descript原创 2012-10-26 09:26:18 · 1565 阅读 · 0 评论 -
hdu 1506 最大矩阵面积 __int64 AC long long TLE
#include#includeusing namespace std;#define maxn 100005int l[maxn],r[maxn],n;__int64 h[maxn],ans;int main(){ //freopen("//media/学习/ACM/input.txt","r",stdin); while(scanf("%d",&n),n)原创 2013-01-15 17:31:15 · 681 阅读 · 0 评论 -
hdu 1024 经典DP 最大m字段和
//最大m段字段和!!#include#include#include#include#includeusing namespace std;const int maxn=1000002;const int INF=1<<30;int dp[2][maxn],a[maxn],n,m;int max(int a,int b){ return a>=b?a:b;}in原创 2013-01-19 10:45:49 · 1009 阅读 · 0 评论 -
hdu 4568 dij+TSP
#include#include#include#include#includeusing namespace std;/*类似 poj 3229 http://blog.youkuaiyun.com/azheng51714/article/details/8166632有n个城市,规定m个城市必须去,求最短时间花费每到一个城市要休息a[i]时间 ,先dij求得各点的最短距离,然后状态压缩D原创 2013-06-03 20:40:07 · 1364 阅读 · 0 评论 -
hdu 4571 Travel in time
Problem Description Bob gets tired of playing games, leaves Alice, and travels to Changsha alone. Yuelu Mountain, Orange Island, Window of the World, the Provincial Museum etc...are scenic spots原创 2013-06-03 10:50:03 · 1221 阅读 · 0 评论 -
去年多校 我买了块表 之 hdu 4301 简单DP
#include#include#include#includeusing namespace std;const int INF=1<<29;const int maxn=1002;const int mod=100000007;long long dp[maxn][maxn*2];///表示第i列被分成j块,且第i列未被分开的情况数int f[maxn][maxn*2];//原创 2013-05-29 16:38:24 · 875 阅读 · 1 评论 -
poj 1948 二维简单背包 拿来练练手 不巧错了3次,sb我吧,什么状态。。。sad
/*题意:给出N(N<=40)根木棍,每根长度为Li(Li<=40),要用完所有的木棍构成面积最大的三角形,求最大面积.思路简单二维背包:dp[i][j] 保证i>=j*/#include#include#include#include#includeusing namespace std;int n,t,edge[47];int sum,dp[888][888];set原创 2013-05-24 10:40:36 · 946 阅读 · 2 评论 -
zoj 3689 简单背包
题意:古代某统治者要修建一些棺材,其中第 i 个棺材大小为 s[i],修建需要花费 t[i] 天,如果在剩余 x 天的时候开始修建并且能够及时完成,则能获得 x * s[i] 的报酬,总共有 T 天可用,问最大能获得的报酬为多少#include#include#include#includeusing namespace std; int dp[10002];struct node原创 2013-04-20 16:31:23 · 949 阅读 · 0 评论 -
hdu 4003 树形dp+分组背包
/*题意:一棵有权树,从根结点中放入K个机器人,求用这K个机器人遍历所有的结点最少的权值和分析:dp[i][j]表示对于以i结点为根结点的子树,放j个机器人所需要的权值和。 当j=0时表示放了一个机器人下去,遍历完结点后又回到i结点了。 状态转移方程类似分组背包 如果我们考虑 一个子树 放了 j个 机器人 返回了j个机器人的最小花费明显大于放了1个原创 2013-04-22 20:46:36 · 790 阅读 · 0 评论 -
ZOJ 3682 简单dp 背包
#include #include #include #include using namespace std ;#define N 101000#define M 10100int n, t ;struct Node{ int p, q ; bool operatorconst Node & a)const{ return (q - p a.q原创 2013-04-22 11:27:01 · 693 阅读 · 0 评论 -
简单树形dp uvaLive 4472
#include#include#include#include#include#includeusing namespace std;const int maxn=100002;int t,n;vectorint>g[maxn];int dfs(int u,int fa){ int i,k,l=g[u].size(); multisetint>p;原创 2013-04-07 16:35:30 · 597 阅读 · 0 评论 -
CF 274 B. Zero Tree
树形dp,求连接到节点1的子树,在合法操作下 需要多少步能整棵树节点变为0;#include#include#include#include#includeusing namespace std;const int maxn=100002;typedef long long ll;ll add[maxn],sub[maxn];int n,val[maxn];vectorEd原创 2013-02-22 15:45:30 · 674 阅读 · 0 评论 -
Java 的函数 调用
/** BigInteger a = BigInteger.valueOf(100);* BigInteger b = BigInteger.valueOf(50);* BigInteger c = a.add(b) // c = a + b;主要有以下方法可以使用: BigInteger add(BigInteger other)BigInteger subtract(B原创 2013-01-21 21:28:45 · 600 阅读 · 0 评论 -
poj 2823 简单单调队列优化dp
///给定一个长N的整数序列,用一个大小为K的窗口从头开始覆盖,问第1-第N-K次窗口里面最大的数字和最小的数字。#include#include#includeusing namespace std;const int maxn=1000012;int q1[maxn],q2[maxn],a[maxn],n,k,ans1[maxn],ans2[maxn];int main(){原创 2013-01-20 17:12:47 · 362 阅读 · 0 评论 -
hdu 2830 简单dp
题意: 给定一个N*M的01矩阵,在可以交换列的情况下,求出最~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~大的全1的子矩阵。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~转化成列的高度值,排序后有 ans=max(ans,h[i]*i)#include#原创 2013-01-20 14:28:53 · 562 阅读 · 0 评论 -
山东理工周赛 3 简单单调队列优化dp
最小子序列和 Time Limit: 1000MS Memory limit: 65536K 题目描述给你一个长为n(10输入 有多组(小于11组)测试数据,每组第一行输入n和k(用空格隔开),第二行输入n个数(数之间用空格隔开)。输出 请输出最小的和。示例输入15 55 4 3 2 1 1 2 3 4 5 5 4 3 2 1示例输出原创 2013-01-19 17:58:44 · 463 阅读 · 0 评论 -
hdu 3415 Max Sum of Max-K-sub-sequence
题意:给出一个有N个数字(-1000..1000,N#include#include#include#include#includeusing namespace std;const int maxn=200012;const int INF=1<<30;int n,k,t,ans,sum[maxn],q[maxn],a[maxn];int main(){ //fre原创 2013-01-19 12:57:51 · 362 阅读 · 0 评论 -
hdu 四边形优化dp
///题目大意:给定一个长度为n的序列,至多将序列分成m段,///每段序列都有权值,权值为序列内两个数两两相乘之和。///m<=n<=1000.#include#include#include#includeusing namespace std;const int maxn=1002;int INF=1<<30;int s[maxn][maxn],sum[maxn],ans,原创 2013-01-19 20:23:08 · 506 阅读 · 0 评论 -
hdu 2993 简单斜率优化dp 学了一手变态输入法
///给由n(n=k的子序列的平均值的最大值。#include#include#includeusing namespace std;const int maxn=100002;const double INF=9999999999.0;int q[maxn],a[maxn],sum[maxn],n,k;double ans;double getDP(int i,int j){原创 2013-01-20 11:28:07 · 702 阅读 · 0 评论 -
poj 3107 树形dp
题目:Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 3645 Accepted: 1230DescriptionLast years Chicago was full of gangster fights and strange murders. The原创 2012-10-31 20:52:18 · 850 阅读 · 0 评论 -
poj 1155 TELE 树形dp
/*大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端,其余点为转发站。客户端i愿支付的钱为pay[i],每一条边需要的花费固定,问电台在保证不亏损的情况下,最多能使多少个客户端接收到信息?广播台所在的节点编号为1dp[i][j] 表示以i 为根j个叶子的最大值!找dp[1][j]>=0的最大j值即可走了两遍dfs 才告别了TLE*/#include原创 2012-10-30 18:46:09 · 491 阅读 · 0 评论 -
hdu 3899 树形dp 这个题目貌似不难,可是好像托了很久
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3899题意:一棵树,给出每个点的权值和每条边的长度,点j到点i的代价为点j的权值乘以连接i和j的边的长度。求点x使得所有点到点x的代价最小,输出非常恶心的题目我调试了N久,一直是WA。最后把long long改成了__int64一下就过了,在此鄙视下杭电的编译器这道题要两次深搜。原创 2012-10-21 10:50:19 · 804 阅读 · 0 评论 -
zoj 3582 概率dp
【题意】有两排灯,每排50个,每天每个灯都有p的概率变亮,变亮之后就不考虑此灯,当每排都有>=m个灯亮时问题结束,求达到这个条件的天数的期望.【想法】dp[i][j]表示两排分别亮了i盏和j盏灯的情况下,到问题结束的期望天数.假设现在这天第一排亮了a盏 ,第二排亮了b盏那么这个概率为所以然后,把等式右边的dp[i][j]移到左边,记忆化搜索即可.原创 2012-09-26 16:29:40 · 690 阅读 · 0 评论 -
hdu 3401 单调队列优化+dp
/*状态转移方程为:买入: dp[i][j]=max(dp[r][k]-(j-k)*ap[i]);(0卖出: dp[i][j]=max(dp[r][k]+(k-j)*bp[i]);(0不买不卖: dp[i][j]=max(dp[i][j],dp[i-1][j]);很明显时间复杂度为o(maxp^2*t^2) 超时!!考虑怎么优化: dp[i][j]+原创 2012-09-06 16:28:27 · 1161 阅读 · 0 评论