洛谷 P3607 [USACO17JAN] Subsequence Reversal P

2024-08-21 01:36

本文主要是介绍洛谷 P3607 [USACO17JAN] Subsequence Reversal P,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目来源于:洛谷

题目本质:动态规划dp,枚举

题目思路:设一个数组dp[l],[r],[L],[R]​,表示从 l 到 r 的区间,值域为 L~R 的最大价值。

状态转移方程为:

dp[l][r][L][R]=max(dp[l][r][L+1][R],dp[l][r][L][R-1]);//把小值域的价值转换到大值域
dp[l][r][L][R]=max(dp[l][r][L][R],dp[l+1][r][L][R]+(a[l]==L));//向左扩展
dp[l][r][L][R]=max(dp[l][r][L][R],dp[l][r-1][L][R]+(a[r]==R));//向右扩展

转换后的最长不下降子序列为:

dp[l][r][L][R]=max(dp[l][r][L][R],dp[l+1][r-1][L][R]+(a[l]==R)+(a[r]==L));//序列翻转后,最大价值 

!记得初始化!

完整代码如下:

 

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int read() {int s = 0, f = 1;char a = getchar();while(a < '0' || a > '9') {if(a == '-') f = -1;a = getchar();}while(a <= '9' && a >= '0') s = s * 10 + a - '0', a = getchar();return s * f;
}
LL dp[55][55][55][55],n,m,a[55],p;
int main() {n=read();for(int i=1; i<=n; i++) {a[i]=read();}for(int i=1;i<=n;i++) {for(int j=1;j<=a[i];j++) {for(int k=a[i];k<=50;k++) {dp[i][i][j][k]=1;}}}for(int len=2;len<=n;len++) {for(int l=1;l<=n;l++) {int r=l+len-1; if(r>n) break;for(int i=1;i<=50;i++) {for(int j=i;j<=50;j++) {dp[l][r][i][j]=max(dp[l][r][i][j],max(dp[l+1][r][i][j]+(a[l]==i),dp[l][r-1][i][j]+(a[r]==j)));dp[l][r][i][j]=max(dp[l][r][i][j],dp[l+1][r-1][i][j]+(a[r]==i)+(a[l]==j));dp[l][r][i][j+1]=max(dp[l][r][i][j+1],dp[l][r][i][j]);dp[l][r][i-1][j]=max(dp[l][r][i-1][j],dp[l][r][i][j]);}}for(int i=1;i<=50;i++) {for(int j=i;j>=1;j--) {dp[l][r][j-1][i]=max(dp[l][r][j-1][i],dp[l][r][j][i]);}}}}printf("%lld",dp[1][n][1][50]);
}

 

这篇关于洛谷 P3607 [USACO17JAN] Subsequence Reversal P的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091745

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

[LeetCode] 300. Longest Increasing Subsequence

题:https://leetcode.com/problems/longest-increasing-subsequence/description/ 题目 Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Input: [10,9,2,5,3,7

[LeetCode] 594. Longest Harmonious Subsequence

题:https://leetcode.com/problems/longest-harmonious-subsequence/description/ 题目 We define a harmonious array is an array where the difference between its maximum value and its minimum value is exactl

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

【HDU】4991 Ordered Subsequence 线段树树状数组

传送门:【HDU】4991 Ordered Subsequence 题目分析:本题就是求长度为m的严格上升序列的个数。 就是个DP! 设dp[ i ][ j ]为以位置i的数为结尾的长度为j的严格上升序列的个数。 则dp[ i ][ j ] = sum { dp[ k ][ j - 1 ] | 1 <= k <= i - 1 } 那么如果朴素O(n^2)不超时是不用想了,这样我们该

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

浙大数据结构:01-复杂度2 Maximum Subsequence Sum

数据结构MOOC PTA习题 01-复杂度2 Maximum Subsequence Sum #include <iostream>using namespace std;const int M = 100005;int a[M];int main(){int k;cin >> k;int f = 1;for (int i = 0; i < k; i++){cin >> a[i

洛谷刷题(7)

P8738 [蓝桥杯 2020 国 C] 天干地支 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。 地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、