![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Dynamic Programing
klchen0112
这个作者很懒,什么都没留下…
展开
-
hdu4489-The-King-s-Ups-and-Downs
hdu4489 The King’s Ups and DownsLast Edited: Jan 26, 2019 5:13 PMTags: acm,dynamic programming题意求N个人高矮或矮高依次排列的个数思路不妨先排列好i个人显然第i+1个人可以插在中间任何一个位置,若在开头则要求i个人的排列是先上升,若在末尾则要求i个人最后一个人是下降得到的设DP[i][0] ...原创 2019-01-26 17:16:29 · 195 阅读 · 0 评论 -
History Grading UVA - 111
输入诡异#include<bits/stdc++.h>using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&num)#define scl(num) scanf("%lld",&num)#define mem(a,b)原创 2019-03-13 16:37:02 · 124 阅读 · 0 评论 -
Human Gene Functions POJ - 1080
类似LCS匹配#include<cstdio>#include <algorithm>using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&num)#define scl(num) scanf("%lld&qu原创 2019-03-13 16:36:34 · 117 阅读 · 0 评论 -
Increasing Sequences POJ - 1239
dp1来枚举最后一位数最短长度dp2来最小的第一个数 #include<cstdio> #include <cstring> #include <algorithm> using namespace std; #define fst first #define sec second #define sci(num) scanf("%d&原创 2019-03-13 16:36:24 · 299 阅读 · 0 评论 -
Jury Compromise POJ - 1015
poj数据不够完善 for (int k = 1; k <= N; k++){ for (int i = M - 1; i >= 0; i--) { for (int j = 0; j <= 2 * fix; j++) { if (DP[i][j] &g...原创 2019-03-13 16:35:29 · 99 阅读 · 0 评论 -
Least common multiple HDU - 3092
将N分解为素数的和。LCM太大,故使用对数保存lcm#include<bits/stdc++.h>using namespace std;#define first fst#define second sec#define sci(num) scanf("%d",&num)#define scl(num) scanf("%lld",&原创 2019-03-13 16:32:13 · 99 阅读 · 0 评论 -
Max Sum HDU - 1003
求最大子段和 及开始结束位置 #include<bits/stdc++.h> using namespace std; int main(){ int T,N; scanf("%d",&T); int number[100000]; for (int j = 1;j<=T;j++){原创 2019-03-13 16:32:29 · 126 阅读 · 0 评论 -
Multiplication Puzzle POJ - 1651
显然1,N是要会留下的dp[l][r] 代表消去l,r区间内的数所能获取的最小值枚举区间内每一个点 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define fst first #define sec second #define ...原创 2019-03-13 16:31:49 · 224 阅读 · 0 评论 -
Prince and Princess UVA - 10635
映射第二个数列的值为第一个数列的下标用单调队列维护长度 #include<bits/stdc++.h> using namespace std; #define fst first #define sec second #define sci(num) scanf("%d",&num) #define scl(num) scanf("%lld",&原创 2019-03-11 17:34:09 · 79 阅读 · 0 评论 -
Robberies HDU - 2955
枚举Mi,算对应的P,取最大概率大于1-P#include<bits/stdc++.h>using namespace std;#define sci(num) scanf("%d",&num)#define scl(num) scanf("%lld",&num)#define mem(a,b) memset(a,b,sizeof a)原创 2019-03-11 17:34:01 · 76 阅读 · 0 评论 -
Shopping Offers POJ - 1170
多重背包组合物品,将其视为一个。应为总共最多五个物品,将每一种的组合转化为6进制。就可以用一维替代,多维的物品,剩下的就是多重背包了#include<iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <ve原创 2019-03-11 17:33:53 · 160 阅读 · 0 评论 -
String painter HDU - 2476
计算空串变成B串的次数,记为dp枚举每一位若A的这一位与B相同显然为F[i-1]枚举从1到i的每一位#include <bits/stdc++.h>using namespace std;#define mem(a,b) memset(a,b,sizeof a)#define sci(num) scanf("%d",&num)#define scl(n...原创 2019-03-11 17:33:34 · 124 阅读 · 0 评论 -
Super Jumping! Jumping! Jumping! HDU - 1087
求LIS 并使得路径上合最大维护个dp即可#include <bits/stdc++.h>using namespace std;int num[1000];int DP[1000];int main(){ int N; scanf("%d",&N); while (N != 0){ num[0] = 0; memset(DP,0,s...原创 2019-03-11 17:33:29 · 107 阅读 · 0 评论 -
Team Them Up! POJ - 1112
若两个人两两不认识这两两两一条边,判断是否能够染色。会将其分为多个可以染色的子图,再dp背包使人数尽可能少#include<iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector&g原创 2019-03-11 17:33:10 · 212 阅读 · 0 评论 -
True Liars POJ - 1417
权值并查集之后就是一个简单的背包之后逆向输出,显然若当前唯一则前置也必定唯一 #include<cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #in原创 2019-03-11 10:58:13 · 266 阅读 · 0 评论 -
Two Rabbits HDU - 4745
求最大的非连续回文串注意相等时更新为+2 否则枚举内部最后答案应为要成环 枚举端点切断两边各自中点可以成为对应位置#include <iostream>#include <cstdio>#include <cstring>#define mem(a,b) memset(a,b,sizeof a)#define sci(num) scanf("%原创 2019-03-11 10:57:50 · 178 阅读 · 0 评论 -
You Are the One HDU - 4283
前缀和注意枚举的更新时的变化 #include<bits/stdc++.h> using namespace std; #define fst first #define sec second #define sci(num) scanf("%d",&num) #define scl(num) scanf("%lld",&num)原创 2019-03-11 10:56:09 · 126 阅读 · 0 评论 -
Palindrome-subsequence-HDU-4632
好菜这么简单的题都想不出来dp式代表i,j内回文串字数最多的次数dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]及是有左端右端减去中间重合部分如果i,j相等说明可以与[i+1,j-1]中的字符串组合成新的子串,并且str[i] 与str[j]也能组合成一个字符串#include<cstdio>#include <algo...原创 2019-03-26 20:55:00 · 126 阅读 · 0 评论 -
hdu4489 The King’s Ups and Downs
题意求N个人高矮或矮高依次排列的个数思路不妨先排列好i个人显然第i+1个人可以插在中间任何一个位置,若在开头则要求i个人的排列是先上升,若在末尾则要求i个人最后一个人是下降得到的设DP[i][0] 为开头上升,DP[i][1]为开头下降。显然开头上升和末尾下降是对称的。同理开头下降和末尾上升是对称的。且DP[i][0] 和DP[i][1]应该相等。所以DP[i+1][0] = DP[j ...原创 2019-03-13 16:37:45 · 115 阅读 · 0 评论 -
最大报销额 HDU - 1864
基本就是个背包,题意有误是每类物品限额#include&lt;bits/stdc++.h&gt;using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&amp;num)#define scl(num) scanf("%lld",&amp;num)#d原创 2019-03-13 16:37:59 · 127 阅读 · 0 评论 -
Codeforces-429B
Codeforces 429BLast Edited: Jan 26, 2019 7:05 PMTags: acm,codeforces,dynamic programming题意地图n*m个格点,每个格点有个值。当人走到格点时会获得对应的点数。两个人一个从左下角走到右上角,仅能向上向右走。一个从左上走到右下角,仅能向右向下走。有且仅有一个格点会被两个人走过。思路四个方向的dp分别计算...原创 2019-01-26 19:08:33 · 184 阅读 · 0 评论 -
codeforces 1110D - Jongmah GNU
[i-2,i-1,i],[i-1,i,i+1],[i,i+1,i+2] 对于i+1状态[i-1,i,i+1]可以由i状态求的古不考虑dp[i][j][k] 用掉j+k个i+1故减去dp[i+1][k][t]=max(dp[i+1][k][t],dp[i][j][k]+(cnt[i+1]−j−k−t)/3+t);dp[i+1][k][t] = max(dp[i+1][k][t],dp[i][j]...原创 2019-02-17 19:25:26 · 361 阅读 · 0 评论 -
codeforces 1114D
思考了一半没想出来主要是两个颜色原本一样的区间问题,若两个端点颜色相同就可以直接把中间染色#include&lt;bits/stdc++.h&gt;using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&amp;num)#define scl(num) scanf("%ll...原创 2019-02-21 17:14:00 · 236 阅读 · 0 评论 -
Advanced Fruits
Advanced Fruits HDU - 1503记录LCS的路径注意更新时路径 #include<bits/stdc++.h> using namespace std; #define fst first #define sec second #define sci(num) scanf("%d",&num) #defin...原创 2019-03-10 18:08:12 · 181 阅读 · 0 评论 -
Bone Collector HDU - 2602
背包模板#include<bits/stdc++.h>using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&num)#define scl(num) scanf("%lld",&num)#define mem(a,b) memset(a,b,s...原创 2019-03-10 18:10:33 · 125 阅读 · 0 评论 -
Brackets POJ - 2955
1.注意两端匹配时要更新if ((str[i] == '(' && str[i + len] == ')') || (str[i] == '[' && str[i + len] == ']') ) { dp[i][i + len] = dp[i + 1][i + len - 1] + 1; ...原创 2019-03-10 18:11:33 · 105 阅读 · 0 评论 -
Cake ZOJ - 3537
凸包处理后,枚举注意切开后至少是个三角形所以R-L> 2 #include <ctime> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std;...原创 2019-03-10 18:13:38 · 180 阅读 · 0 评论 -
Codeforces 429B
题意地图n*m个格点,每个格点有个值。当人走到格点时会获得对应的点数。两个人一个从左下角走到右上角,仅能向上向右走。一个从左上走到右下角,仅能向右向下走。有且仅有一个格点会被两个人走过。思路四个方向的dp分别计算从(1,1),(n,1)走到这个点的最大值。和这个点到(1,m),(n,m)的最大值。显然只有左下角的人从左向右或从下到上时,对应未从上到下或从左到右时相交。 #inclu...原创 2019-03-10 18:14:56 · 69 阅读 · 0 评论 -
Coloring Brackets CodeForces - 149D
dp[][][][] 第三第四维分别记录两端点颜色stack记录每个位对应匹配位l,r匹配仅需更新内部否则更新l,mch[l]和mch[l]+1,r的值,再由他们更新#include <bits/stdc++.h>using namespace std;#define mem(a,b) memset(a,b,sizeof a)#define sci(num) scan...原创 2019-03-10 18:26:47 · 148 阅读 · 0 评论 -
Coins HDU - 2844
背包,注意更新从大到小#include<bits/stdc++.h>using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&num)#define scl(num) scanf("%lld",&num)#define mem(a,b) memse...原创 2019-03-10 18:29:11 · 140 阅读 · 0 评论 -
Common Subsequence HDU - 1159
模板 #include &lt;stdio.h&gt; #include&lt;string.h&gt; #include &lt;iostream&gt; using namespace std; int DP[1000][1000]; char s1[1000],s2[1000]; int main() { whi...原创 2019-03-13 16:43:31 · 97 阅读 · 0 评论 -
Diablo III ZOJ - 3769
将多个物品化为一个物品的01背包,注意下组合即可,还有Hand武器如果只有一个也要加入。进行背包要按每种物品的个数从大到小#include &lt;bits/stdc++.h&gt;using namespace std;#define sci(num) scanf("%d",&amp;num)#define mem(a,b) memset(a,b,sizeof a)const in...原创 2019-03-13 16:42:47 · 145 阅读 · 0 评论 -
FATE HDU - 2159
Last Edited: Feb 21, 2019 6:20 PMTags: dynamic programming,hdu,knapsack problem第一维是忍耐度,第二维是杀怪数量,每次枚举杀了几只#include&lt;bits/stdc++.h&gt;using namespace std;#define fst first#define sec second#defi...原创 2019-03-13 16:42:23 · 132 阅读 · 0 评论 -
Food Delivery ZOJ - 3469
通过dp的第三维记录在左端右端再分别枚举由子问题左端与右端来的情况#include &lt;bits/stdc++.h&gt;using namespace std;#define fst first#define sec second#define mem(a,b) memset(a,b,sizeof a)#define sci(num) scanf("%d",&amp;num...原创 2019-03-13 16:42:08 · 201 阅读 · 0 评论 -
Fruit Ninja ZOJ - 3638
将所有至少的个数和记为sum,对M-sum进行个数有限制的背包#include&lt;bits/stdc++.h&gt;using namespace std;#define fst first#define sec second#define sci(num) scanf("%d",&amp;num)#define scl(num) scanf("%lld",&原创 2019-03-13 16:41:58 · 206 阅读 · 0 评论 -
Halloween Costumes LightOJ - 1422
当c[e-1] = c[e] 时显然有dp[][e] = dp[][e-1]更新是更新当第k场舞会衣服与第e场衣服一致时,假设第k场衣服一直穿着 #include&lt;bits/stdc++.h&gt; using namespace std; #define fst first #define sec second #define sci(num)...原创 2019-03-13 16:39:00 · 180 阅读 · 0 评论 -
Harmonic Number (II) LightOJ - 1245
类似因数分解对于所有下于sqrt(N)值i,有(N/(i+1), N/(i)]的所有数贡献的权值为i,而大于sqrt(N)的值仅有一次可以得到 #include&lt;bits/stdc++.h&gt; using namespace std; #define fst first #define sec second #define sci(num) sc...原创 2019-03-13 16:38:51 · 148 阅读 · 0 评论 -
Rebuilding-Roads-POJ-1947
Rebuilding Roads POJ - 1947Last Edited: May 27, 2019 7:32 PMTags: dynamic programming,poj设定dp[u][j]为以u为根大小为j的最小值注意dp[u][1] 为1对于每个节点若考虑去除某个子节点显然其已知的dp[u][j]应加一对于保留某子节点的情况需考虑当前为j的情况以及其子节点取k个的情况易得...原创 2019-05-27 19:37:46 · 172 阅读 · 0 评论