dp
文章平均质量分 84
动态规划
fly_tzf
这个作者很懒,什么都没留下…
展开
-
AtCoder Regular Contest 133 B - Dividing Subsequence(LIS)
题意:给定两个1到n的排列P、Q。从P、Q中找到一个最长的子序列,满足以下条件:1、P中的子序列和Q中的子序列长度相同,设为k。2、a、b分别是P、Q的子序列,a=(a1,a2,...,ak),b=(b1,b2,...,bk)a=(a_1,a_2,...,a_k), b=(b_1,b_2,...,b_k)a=(a1,a2,...,ak),b=(b1,b2,...,bk),对于1<=i<=k,1<=i<=k,1<=i<=k,都有bib_ibi是aia_ia原创 2022-01-24 23:50:39 · 453 阅读 · 0 评论 -
Atcoder ABC200E Patisserie ABC 2(容斥原理)
题意构造N3(N<=106)个三元组(i,j,k)从左到右排列,1<=i,j,k<=N。排列规则如下:按照sum=i+j+k的和,升序排列如果sum相等,那么i小的放在左边如果sum和i都相等,那么j小的放在左边请找到第K个三元组。Sample Input 12 5Sample Output 11 2 2样例一的所有排列如下:(1,1,1),(1,1,2),(1,2,1),(2,1,1),(1,2,2),(2,1,2),(2,2,1),(2,2,2).Sampl原创 2021-05-21 16:50:45 · 669 阅读 · 0 评论 -
UVA - 10534 Wavio Sequence(LIS)
题意:给定一个长度为n的整数序列a,求一个最长子序列,使得该序列的长度为2*k+1,前k+1个数严格递增,后k+1个数严格递减。思路:用二分法求最长上升子序列。问题转化为求以i结尾的最长上升子序列和以i开始的最长递减子序列,而以i开始的最长递减子序列可以看作从n开始以i结尾的最长上升子序列。用dp[i]表示长度为i的子序列尾部元素的最小值,显然dp[i]为递增的,那么就可以二分查找了。用num原创 2017-04-21 21:37:43 · 263 阅读 · 0 评论 -
UVALive - 4256 Salesmen(LIS变形)
题意:给定一个包含n(n 思路:用dp[i][j]表示从1到位置i以j为结尾的最小修改的数,则答案为max(dp[L][1~n]).如果a[i] == j, dp[i][j] = min(dp[i - 1][j], dp[i - 1][k]) 。否则dp[i][j] = min(dp[i - 1][j] + 1, dp[i - 1][k] + 1) j与k为相邻节点。#include原创 2017-04-21 21:50:39 · 276 阅读 · 0 评论 -
UVA - 11552 Fewest Flops (dp)
思路;用dp[i][j]表示到第i组末尾为字母j块的最小值,那么dp[i][j] = min(dp[i][j], dp[i-1][l] + f[i] - 1), 第i组和第i-1组含有字母l,并且l和j不同,否则dp[i][j] = min(dp[i][j],dp[i-1][l] + f[i]).f[i]为每组的不同字母数。#include#include#include#include原创 2017-05-16 16:26:12 · 290 阅读 · 0 评论 -
hdu 2059 龟兔赛跑(DP)
思路:用dp[i][0]表示到第i个加油站不加油所用的最小时间,dp[i][1]表示到第i个加油站加油所用的最小时间。将终点设为第n+1个站,则答案为dp[n+1][0].具体细节看代码。#include#include#include#includeusing namespace std;typedef long long LL;const LL INF = 1000000000原创 2017-05-31 21:46:15 · 278 阅读 · 0 评论 -
hdu - 6125 Free from square (状态压缩+分组背包)
思路:考虑到n最多为500,小于sqrt(n)的素因子有八个,可以用二进制表示,而大于sqrt(n)的质因子每个数只可能出现一次,即一个数分为两部分,小于sqrt(n)的质因子状压, 大于sqrt(n)的质因子至多有一个用分组背包。那么含有大于sqrt(n)的素因子的数可以分组。例如71,142,213,355,426,497为一组,因为任意两个选了之后都能被71整除 。组与组之间是不冲突的,因为原创 2017-08-16 17:29:52 · 349 阅读 · 0 评论 -
POJ 2288 Islands and Bridges(状压dp)
思路:所求的哈密顿路径由三部分组成,一,所有节点的权值之和,二,每条边的权值之和,三,三元环的权值和。设集合S为拜访的点的集合,当向集合S中加入一个点,与上一条边的起点和终点有关。所以令dp[s][i][j]表示集合S通过边(i, j)加入j点之后的最大权值。那么 dp[s][i][j] = max(dp[s][i][j], dp[p][k][i] + tmp). p表示未加入j点的集合,tm原创 2017-08-07 12:30:46 · 260 阅读 · 0 评论