
动态规划
liu_zhоu
这个作者很懒,什么都没留下…
展开
-
区间DP
概念区间类动态规划是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来由很大的关系。令状态 $ f(i,j) $ 表示将下标位置 到 的所有元素合并能获得的价值的最大值,那么 $ f(i,j)=max{f(i,k)+f(k+1,j)+cost} $ ,$ cost $ 为将这两组元素合并起来的代价。特点合并 :即将两个或多个部分进行整合,当然也可以反过来;特征 :能将问题分解为能两两合并的形式;求解 :对整个问题设最优值,枚举合并点,将问题分原创 2020-07-20 21:02:28 · 110 阅读 · 0 评论 -
乌龟棋
题目传送门luogu分析暴力的来看 这道题用动态规划求解,则可以定义状态 $ f[i][j][k][l] $ ,表示使用了 $ i $ 张 $ a $ 卡片, $ j $ 张 $ b $ 卡片, $ k $ 张 $ c $ 卡片, $ l $ 张 $ d $ 卡片后可以获得的最大分数,可以将它理解为一个多维的走楼梯问题,每次有 $ 4 $ 种走法状态转移方程如下if(i != 0) dp[i][j][l][k] = max(dp[i][j][l][k], dp[i - 1][j][l][k] +原创 2020-06-22 14:44:42 · 161 阅读 · 0 评论 -
最长上升子序列(LIS)详解
定义最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。引自百度百科状态与状态转移方程最长上升子序列是序列,其状态是一维的,所以我们可以定义状态 f(i),表示以a[i]结尾的最长上升子序列如果每一个元素都只考虑它本身,则以a[i]结尾的最长上升子序列长度为一,即它本身,则初始化f[i] = 1如果a[i]比a[j]大(i>j),则a[i]可以添加到以a[j]结尾的最长上升子序列的末尾,即f[原创 2020-06-22 14:43:48 · 838 阅读 · 0 评论 -
传纸条
luogu-P1006#include <cstdio>#include <algorithm>const int MAXN = 55;int m, n, a[MAXN][MAXN], f[MAXN][MAXN][MAXN][MAXN];//f[i][j][k][l] 为两纸条分别传到(i, j),(k, l)的最大好感度bool flag[MAXN][MAXN] = {};int MAX(int i, int j, int k, int l) { return原创 2020-05-29 13:56:56 · 115 阅读 · 0 评论 -
数列的整除性
luoguP1356#include <cstdio>#include <cstring>#include <cmath>const int MAXN = 1e4 + 5;int t, n, k, s[MAXN], f[MAXN][105];////f[i][j]表示前i个数字运算之后余数是否为jint main() { scanf("%d", &t); while(t --) { scanf("%d %d", &n, &原创 2020-05-27 13:58:08 · 337 阅读 · 0 评论 -
最长上升子序列(LIS)nlogn算法
替换其实是为后面的元素让出更多的空间,如果有更小的元素,才能插入,如果没有,则对最终结果也没有影响#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 100005;int x, f[MAXN], n, ans = 1;//f为答案序列int main() { scanf("%d", &n); for(int i = 1; i <= n; i ++) .原创 2020-05-13 14:09:43 · 188 阅读 · 0 评论