动态规划
文章平均质量分 51
~
verdin黄大锤
afo啦!
展开
-
几道斜率优化
见注释,注意一下由于要移项,所以x一定要是大减小!任务安排 1 2 3#include<bits/stdc++.h>using namespace std;#define read(x) scanf("%d",&x)#define inf (1LL<<60)#define maxn 5000 #define maxS 50#define maxw 100#define ll long longint n,S;int t[maxn+5],c[maxn+原创 2021-11-20 20:40:37 · 260 阅读 · 0 评论 -
换根dp 2021江西 gym103366I. Homework
I. HomeworkTsiying has a sequence of positive integers with a length of n and quickly calculates all the factors of each number. In order to exercise his factor calculation ability, he has selected q consecutive subsequences from the sequence and found a原创 2021-11-10 15:38:13 · 366 阅读 · 0 评论 -
2021年中国大学生程序设计竞赛女生专场 gym103389C 连锁商店
C. 连锁商店比特山是一个旅游胜地,它一共有 n 个景点,按照海拔高度从低到高依次编号为 1 到 n。为了更好地帮助游客们欣赏这里的风景,人们在上面搭建了 m 条缆车路线。每条缆车路线只可能把游客们从某个海拔较低的景点运送到另一个海拔较高的景点。在每个景点都有一家纪念品连锁商店,其中第 i 个景点的商店隶属第 ci 号公司,两家连锁店 (i,j) 隶属同一公司当且仅当 ci=cj。每家公司都有新客优惠活动,其中第i家公司对于新客的优惠红包为 wi 元,一旦领取了隶属该公司的某家连锁店的一份红包,就不能原创 2021-11-02 20:40:55 · 753 阅读 · 0 评论 -
CF607B. Zuma
Zuma给一个序列,每次操作可以取出一个回文串,两侧的数字会向中间合并。问最少操作次数。区间dp,f[i][j]f[i][j]f[i][j]代表取完区间[i,j][i,j][i,j]的操作次数。f[i][j]=min(f[i][k]+f[k+1][j])f[i][j]=min(f[i][k]+f[k+1][j])f[i][j]=min(f[i][k]+f[k+1][j])。a[i]==a[j]a[i]==a[j]a[i]==a[j]时,f[i][j]=f[i+1][j−1]f[i][j]=f[i+原创 2021-10-28 20:52:25 · 136 阅读 · 0 评论 -
P2656 采蘑菇 (卡精度)
P2656 采蘑菇一个强连通分量里的所有蘑菇都可以被采完。先缩点,得到一个DAG,拓扑排序,然后DP。要注意拓扑排序的起点不是题目给的起点。WA四个点的原因是精度不够,可以把恢复系x10用int存储,计算时再除以10。#include<bits/stdc++.h> using namespace std;#define read(x) scanf("%d",&x)#define maxn ((int)8e4) #define inf 2147483647stru原创 2021-10-22 23:21:38 · 161 阅读 · 0 评论 -
两道区间dp
P3146 [USACO16OPEN]248 Gf[i][j]f[i][j]f[i][j]为完全合并[i,j][i,j][i,j]获得的最大数,当f[i][k]==f[k+1][j]f[i][k]==f[k+1][j]f[i][k]==f[k+1][j]时可以合并,f[i][j]=f[i][k]+1f[i][j]=f[i][k]+1f[i][j]=f[i][k]+1。#include<bits/stdc++.h>using namespace std;#define read(x) s原创 2021-10-21 20:09:16 · 91 阅读 · 0 评论 -
uva 10917 Walk Through the Forest
题目:Walk Through the Forest题意:给出一张有向图,问从1走到2有多少种不同的路径,使经过的每一条有向边A->B均满足dist[A])。思路:先用dijkstra求最短路,然后在所有满足dist[A]注意:1、priority_queue是大根堆,定义2、对于dist[A]B的边,才能在这两点之间连边。3、由于用的是记忆化搜索,原创 2018-02-26 11:13:26 · 208 阅读 · 0 评论 -
uva 11324 The Largest Clique
题目:The Largest Clique题意:给出一个有向图G,求一个所含节点数最大的子图,满足其种任意两个节点之间都存在一条路径,使这两个节点单向连通。思路:由于每个强连通分量一定符合条件,所以可以先tarjan缩点。缩点后原图边成一个带权有向无环图(权值为这个新图中的节点代表的原图中点的个数),要求解图中的最长路,用dp即可。代码:#inclu原创 2018-02-21 17:19:18 · 199 阅读 · 0 评论 -
416D Population Size
题目 : http://codeforces.com/problemset/problem/416/D思路:从上一个等差数列的结尾加一处开始找两个非-1的数,算出公差。如果公差为小数或者该公差导致前面的一串-1中有可能会有数变成非正数,就将第一个非-1的数和前面的一堆-1和两数间的一堆-1作为第一个数列,再以第二个非-1的数开头找等差数列。否则就再向后找可以合并到这个等差数列的数加入这个数列...原创 2016-10-29 20:15:50 · 595 阅读 · 0 评论 -
洛谷1439 模板 最长公共子序列
题目:最长公共子序列思路:这题用一般的DP来做,f( i , j )表示A的前i位和B的前j位的最长公共子序列的长度,时间复杂度为O(n^2),在这题会TLE。在这题中,需要用O(nlogn)的复杂度实现。先设计一个数组b[],b[i]代表B串中的数第i个数在A串中的位置。例如:A串: 3 2 1 4 5B串: 5 4 3 2 1b[ ]: 5 4 1 2 3这时,求AB两串的最长公共子序列也就是...原创 2018-04-02 20:01:00 · 389 阅读 · 0 评论 -
uva 10635 Prince and Princess
题目:Prince and Princess思路:转换一下就相当于一个最长公共子序列。以前写过的:【模板】最长公共子序列复杂度 O(nlogn)注意:A中的数B中没有时要注意一下不能喝有的时候一起考虑。代码:#include<bits/stdc++.h>using namespace std;#define maxn 62500#define inf (1<<30)...原创 2018-04-15 17:57:50 · 132 阅读 · 0 评论 -
noip 2008 洛谷 1006 传纸条
题目:传纸条思路:DP。先假设两次传纸条都是从( 1 , 1 )传到 ( n , m )。f[k][i][j] 表示传到第k-2步,第一轮的横坐标为i,第二轮的横坐标为j时,获得的最大好心程度。其中k也表示每一轮横纵坐标的和,即第一轮的纵坐标就是 k-i,第二轮的纵坐标就是 k-j 。转移方程: f[k][i][j]=max(f[k-1][i-1][j-1],f[k-1][i][j-1],f[k-...原创 2018-04-04 16:44:25 · 197 阅读 · 0 评论 -
洛谷 1057 传球游戏
题目:传球游戏思路:DP。不妨设小蛮就是第一个人f[i][j]表示第i轮传到第j个人的方案数。边界f[0][1]=1,f[0][j]=0(j∈[2,n])。状态转移方程:f[i][j]=f[i-1][j-1]+f[i-1][j+1]注意:一定不要试图用滚动数组…代码:#include<bits/stdc++.h>using namespace std;#define maxn 3...原创 2018-04-04 19:44:21 · 247 阅读 · 0 评论 -
普及组2012 洛谷 1077 摆花
题目:摆花思路:DP。f[i][j]表示前i种花摆j盆的方案数。转移方程:f[i][j]=f[i-1][j]+f[i-1][j-k] ,k为第i种花摆的盆数。可以用滚动数组优化空间去掉第一维。代码:#include<bits/stdc++.h>using namespace std;#define md 1000007#define maxn 100 int n,m;in...原创 2018-04-05 10:32:52 · 247 阅读 · 0 评论 -
洛谷1216 IOI99 数字三角形
题目:数字三角形思路:dp+滚动数组优化。f[i][j]表示走到第(i,j)的位置得到的最大数,滚动第一维。转移方程:f[j]=max(f[j],f[j-1])+a[i][j]注:这是一道IOI的题目…代码:#include<bits/stdc++.h>using namespace std;int n;int ans=0;int a[1005][1005]={0};int...原创 2018-04-22 16:36:12 · 230 阅读 · 0 评论 -
最长上升子序列
题目:最长上升子序列思路:复杂度O(nlogn),相当于朴素dp的二分优化。f[i]表示长度为i的最长上升子序列结尾的数。二分用lower_bound实现。代码:#include<bits/stdc++.h>using namespace std;int n;int ans=0;int a[10005]= {0};int f[10005]= {0};int main()...原创 2018-04-22 17:14:18 · 119 阅读 · 0 评论 -
uva 10891 Game of Sum
题目:Game of Sum参考:%%%大佬思路:DP。f[i][j]表示还剩下区间[i,j]时先手得分的最大值。转移方程:f[i][j]=a[j]-a[i-1]-min(0,f[i][k],f[k+1][j]) 。 (k∈[1,j])复杂度O(n^2)。可以令g1[i][j]=min(g1[i+1][j],g1[i+2][j], … ,g1[j][j]) ,g2[i][j]=min(g2[i][...原创 2018-04-18 20:11:34 · 170 阅读 · 0 评论 -
最大子矩阵
题目:最大子矩阵思路:前缀和+扫描线(或者是dp?听说是dp?),复杂度O(n^3)。枚举最大子矩阵的上下边界,然后把每一列的和加起来成为一个序列,注意这里要用前缀和优化。嗯然后对于这个子序列再求前缀和,然后扫描线扫一遍,每次用自己减去前面的最小值更新最大的答案。当然这个题目的数据朴素算法O(n^4)可过的。一维问题:Subsequence代码:O(n^3)算法:#include<bits/...原创 2018-04-22 22:42:17 · 183 阅读 · 0 评论 -
01背包模板
题目:01背包问题思路:裸的…加了个滚动数组。代码:#include<bits/stdc++.h>using namespace std;#define maxm 200#define maxn 30int m,n;int w[maxn+5],c[maxn+5];int f[maxm+5]={0};int main(){ scanf("%d%d",&m,&...原创 2018-04-30 14:36:22 · 103 阅读 · 0 评论 -
完全背包模板
题目:完全背包问题思路:模板+滚动数组…代码:#include<bits/stdc++.h>using namespace std;#define maxm 200#define maxn 30int m,n;int w[maxn+5],c[maxn+5];int f[maxm+5]= {0};int main() { scanf("%d%d",&m,&a...原创 2018-04-30 15:02:12 · 255 阅读 · 0 评论 -
庆功会 多重背包模板
题目:庆功会思路:模板+滚动数组…代码:#include<bits/stdc++.h>using namespace std;#define maxm 6000#define maxn 500int m,n;int w[maxn+5],c[maxn+5],num[maxn+5];int f[maxm+5]= {0};int main() { scanf("%d%d...原创 2018-05-01 22:03:19 · 641 阅读 · 0 评论 -
【模板·混合背包】
题目:混合背包 思路:和多重背包几乎一样,就是在p==0时把数量改成inf就可以了。加个滚动数组。 代码:#include<bits/stdc++.h>using namespace std;#define maxm 6000#define maxn 500int m,n;int w[maxn+5],c[maxn+5],num[maxn+5]...原创 2018-05-01 22:09:15 · 215 阅读 · 0 评论 -
潜水员
题目:潜水员思路:类似于背包。f[i][j]代表 能产生N2的数量为i,O2的数量为j 的最小质量。转移方程:f[j][k]=min(f[j-c1[i]][k-c2[i]]+w[i],f[j][k]) 。要注意加上 f[j][k]=min(f[j][k],min(f[j+1][k],f[j][k+1])) 。代码:#include<bits/stdc++.h>using namesp...原创 2018-05-04 22:10:45 · 681 阅读 · 0 评论 -
分组背包
题目:分组背包思路:时间复杂度O(n^v)。f[i][j]表示前i组,使用j个空间的最大价值。f[i][j]=max(f[i-1][j],f[i][j-w[k]]+c[k]) 可以滚动数组优化第一维。代码:#include<bits/stdc++.h>using namespace std;#define maxv 200#define maxt 10#define maxn...原创 2018-05-05 10:54:15 · 405 阅读 · 0 评论 -
货币系统
题目:货币系统思路:dp。复杂度迷?类似于完全背包吧f[j]表示构成面额j的方案数。转移方程:f[j]+=f[j-k*a[i]]代码:#include<bits/stdc++.h>using namespace std;#define maxv 100000long long f[maxv+5]={0},a[maxv+5];int v,n;int main() { s...原创 2018-05-05 12:18:51 · 695 阅读 · 0 评论 -
数字组合
题目:数字组合思路:就是个01背包代码:#include<bits/stdc++.h>using namespace std;#define maxv 1000long long f[maxv+5]={0};int a[maxv+5];int v,n;int main() { scanf("%d%d",&n,&v); f[0]=1; for(in...原创 2018-05-05 12:40:38 · 273 阅读 · 0 评论 -
买书
题目:买书思路:dp。f[i]表示花i块钱的方案数。类似于完全背包。转移方程:f[i]+=f[i-a[j]*k],边界f[0]=0。当n<10是特判。代码#include<bits/stdc++.h>using namespace std;#define maxn 1000int n;int a[10]= {0,10,20,50,100};int f[maxn+5]...原创 2018-05-11 22:11:47 · 181 阅读 · 0 评论 -
Charm Bracelet
题目:Charm Bracelet思路:裸的01背包……要用滚动数组。代码:#include<bits/stdc++.h> using namespace std; #define maxn 3500 #define maxm 12880 int m,n; int w[maxn+5],c[maxn+5]; int f[maxm+5]={0}; ...原创 2018-05-11 22:30:33 · 251 阅读 · 0 评论 -
宠物小精灵之收服
题目:宠物小精灵之收服思路:二维背包代码:#include<bits/stdc++.h>using namespace std;#define maxn 1000int n,m,k;int w[maxn+5],c[maxn+5];int f[maxn+5][maxn+5]= {0};int main() { scanf("%d%d%d",&n,&m,...原创 2018-05-06 15:03:03 · 453 阅读 · 0 评论 -
洛谷1049 装箱问题
题目:装箱问题思路:dp。bool f[i][j]表示取前i个物品能否恰好占用j个空间。转移方程f[i][j]=f[i-1][j-w[i]] | f[i-1][j]最开始maxm和maxn的数值写反了……Wa了好久。代码:#include<bits/stdc++.h>using namespace std;#define maxm 20000#define maxn 30i...原创 2018-05-13 20:03:10 · 264 阅读 · 0 评论 -
开餐馆
题目:开餐馆思路:dp。f[i]表示使用前i个地点获得的最大收益。f[i]=max(f[i],f[j]+w[i])代码:#include<bits/stdc++.h>using namespace std;#define maxk 1000#define maxn 100#define inf (1<<30)int n,k;int m[maxn+5],w[m...原创 2018-05-13 21:24:50 · 422 阅读 · 0 评论 -
登山
题目:登山思路:枚举一个点,在左边求最长上升子序列,右边求最长下降子序列(均包括这个点),把这两个值相加减一。注意:lower_bound和upper_bound的用法。之前写错了的,调了很久。代码:#include<bits/stdc++.h>using namespace std;#define maxn 1000#define inf (1<<30)int...原创 2018-04-29 10:26:01 · 626 阅读 · 0 评论 -
摘花生
题目:摘花生思路:可以滚动数组优化下。转移方程 f[j]=max(f[j],f[j-1])+a[i][j]代码:#include<bits/stdc++.h>using namespace std;#define maxn 100int n,m;int f[maxn+5];int main() { int T; scanf("%d",&T); while(...原创 2018-04-29 10:46:09 · 393 阅读 · 0 评论 -
最大上升子序列和
题目:最大上升子序列和思路:dp。f[i]表示以a[i]结尾的最大上升子序列和。转移方程:f[i]=max(f[i],f[j])+a[i] ( i∈[1,j-1),a[i]<a[j] )代码:#include<bits/stdc++.h>using namespace std;#define maxn 1000#define maxm 10000int n;int ...原创 2018-04-29 12:56:00 · 364 阅读 · 0 评论 -
怪盗基德的滑翔翼
题目:怪盗基德的滑翔翼思路:求最长上升子序列和最长下降子序列的最大值。代码:#include<bits/stdc++.h>using namespace std;#define maxn 100#define inf (1<<30)int n;int a[maxn+5];int find1() { int f[maxn+5]= {0},len=...原创 2018-04-29 13:16:04 · 344 阅读 · 0 评论 -
最低通行费
题目:最低通行费思路:滚动数组优化。转移方程 f[j]=min(f[j],f[j-1])+a[i][j]注意滚动数组引起的初始化问题。代码:#include<bits/stdc++.h>using namespace std;#define maxn 100#define inf (1<<30)int n;int f[maxn+5]= {0};int ma...原创 2018-04-29 13:45:44 · 269 阅读 · 0 评论 -
导弹拦截
题目:导弹拦截思路:最长不上升子序列代码:#include<bits/stdc++.h>using namespace std;#define maxn 15#define inf (1<<30)int n;int a[maxn+5]= {0};int f[maxn+5]={0};bool cmp(int x,int y){ return y<x...原创 2018-04-29 13:55:29 · 190 阅读 · 0 评论 -
洛谷1880 NOI1995 石子合并
题目:石子合并思路:断环为链。sum[i]为原序列的前缀和。令f[i,j]为一段以i为起点长度为j的石子合并需要的最小代价。转移方程:f[i][j]=min(f[i][j],f[i][k-i+1]+f[k+1][ed-k]+sum[ed]-sum[i-1]);其中,k为划分点,ed为这一段石子的末位置,即i+j-1。主要的思想差不多就是枚举一个点把当前这段石子分为两部分,这一段的最小代价就是每次划...原创 2018-06-24 23:29:35 · 209 阅读 · 0 评论 -
OpenJudge 8462 一本通 1301 大盗阿福
题目:大盗阿福思路:dp。f[i]表示最后一个店抢劫的是i时的最大收益。转移方程:f[i]=max(f[i-2],f[i-3])+a[i]代码:#include<bits/stdc++.h>using namespace std;#define maxn 100000#define maxm 1000#define inf (1<<30)int n;int ...原创 2018-06-29 14:21:44 · 530 阅读 · 0 评论 -
OpenJudge 8464 股票买卖
题目:股票买卖思路:可能是这个题(UVA 11078)的升级版……就是正反跑两次这个算法,再求最大值。代码:#include<bits/stdc++.h>using namespace std;#define inf (1<<30)#define maxn 100000int n;int a[maxn+5];int f[maxn+5],g[maxn+5];...原创 2018-06-29 16:58:38 · 480 阅读 · 0 评论