上升、公共子序列
上升、公共子序列问题
Selvaggia
这个作者很懒,什么都没留下…
展开
-
【无标题】
6045:开餐馆#include <bits/stdc++.h>using namespace std;int a[105];int p[105];int dp[105];//表示到达前i个地点时获得的利润 int main(){ ios::sync_with_stdio(false); cin.tie(0); int t,n,k; cin>>t; while(t--){ cin>>n>>k;//n个地点可选,距离必大于k,最大利润原创 2022-01-21 13:23:31 · 262 阅读 · 0 评论 -
1996:登山
1996:登山传送门1、此题坑点在于先上山后要下山2、最后求上升子序列+下降子序列的最长长度类似 1481:Maximum sum这题3、要注意的是写双重循环时内重循环 j++ 不要 写成外层循环变量 i++这种错误在写这题出现了两次,陷入死循环不得出来在此题中用这样 求下降子序列长度的方式 行不通,因为最终求的是从左到右的最长上升子序列+接着的最长下降子序列,如果这种循环方式确实能求出最长下降子序列,但是dp1[i]表示的就是从下标0到i这一段的最长下降子序列原创 2021-12-29 19:53:57 · 318 阅读 · 0 评论 -
3532:最大上升子序列和
最大上升子序列和关于求 公共子序列、最长上升子序列、最大子序列和状态都是 紧扣 以数组的某一元素作为所求序列的最后一个元素时得到的res已经求出dp[1i-1],如果a[i]>a[j(1i-1)],dp[i]=max(dp[i],dp[j]+a[i]);#include <bits/stdc++.h>using namespace std;int a[1005];int dp[1005];//以a[i]结尾的最大上升子序列和 int main(){//最大上升子序列和不原创 2022-01-20 16:01:07 · 619 阅读 · 0 评论 -
2000:最长公共子上升序列
2000:最长公共子上升序列最长公共子序列公共子序列 要按照 在第一个数组中的顺序输出,必须以第一个数组中的数作为公共序列的最后一个数。所以dp数组中的每一个node类型的元素dp[i]代表的时以a【i】结尾的公共子序列的情况所以针对b数组中每一个元素,去与a数组中的所有元素进行一轮比较,这过程中,dp【i】的情况每比较一轮都可能发生变化,用currentlen记录这一轮的最长子序列情况(每一轮开始currentlen变量必须初始化,即使在循环内部重新定义这个变量node currentlen;都不行原创 2021-12-30 15:49:53 · 401 阅读 · 0 评论 -
动态规划Dynamic programming
#include <bits/stdc++.h>using namespace std;//1、分解成子问题 2、无后效性,一种状态A只与另一种状态B的值有关,与状态B的到达方式无关 int main(int argc, char** argv) { int n; cin>>n; int a[n]; int dp[n];//存放以a[k]为结尾的序列的最长上升子序列// dp[0]=1; for(int i=0;i<n;i++){ cin>&g原创 2021-10-22 19:29:20 · 65 阅读 · 0 评论