首页 > 其他分享 >[USACO17JAN] Subsequence Reversal P

[USACO17JAN] Subsequence Reversal P

时间:2024-10-28 12:31:45浏览次数:6  
标签:ch freopen int USACO17JAN Subsequence maxn Reversal dp 翻转

根据数据范围,不难想到 DP 状态应该是 \(n^4\) 级别的。

先考虑当没有反转区间的操作时如何转移。

设 \(dp_{l,r,L,R}\) 表示当前区间为 \(l\sim r\),值域 \(\in [L,R]\) 时的答案。转移时枚举四个维度,可以从 \(dp_{l,r,L,R-1},dp_{l,r,L+1,R},dp_{l+1,r,L,R},dp_{l,r-1,L,R}\) 转移过来。

加上翻转操作后,我们思考其本质。翻转一个子序列可以理解为交换某几对数字的位置,这样的话相当于如果 \(a_l=R\) 或者 \(a_r=L\) 的话,我们可以通过翻转 \(l\sim r\) 中的任意一个包含 \(l,r\) 的子序列来满足条件,即 \(dp_{l,r,L,R}=dp_{l+1,r-1,L,R}+[a_l=R]+[a_r=L]\)。

由于区间 DP 按照区间从小到大的顺序,故可以保证这样的翻转满足题目条件,所以这道题就结束了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int mod=998244353;
const int maxn=51;
const int inf=3e17+7;
int n,a[maxn],dp[maxn][maxn][maxn][maxn];
signed main()
{
#ifdef Lydic
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);

//  #else
//   	freopen("Stone.in","r",stdin);
//   	freopen("Stone.out","w",stdout);
#endif
    cin>>n;
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=n;i++)
        for(int l=1;l<=a[i];l++)
            for(int r=a[i];r<=50;r++)
                dp[i][i][l][r]=1;
    for(int len=2;len<=n;len++)
    {
        for(int l=1;l<=n-len+1;l++)
        {
            int r=l+len-1;
            for(int lenn=1;lenn<=50;lenn++)
            {
                for(int L=1;L<=50-lenn+1;L++)
                {
                    int R=L+lenn-1;
                    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));
                }
            }
        }
    }
    cout<<dp[1][n][1][50];
	return 0;
}

标签:ch,freopen,int,USACO17JAN,Subsequence,maxn,Reversal,dp,翻转
From: https://www.cnblogs.com/Lydic/p/18510224

相关文章

  • Subsequence and Prefix Sum
    SubsequenceandPrefixSum\(n\)才\(100\),\(a_i\)才\(20\),显然DP。设\(f_{i,j}\)表示第\(i\)个数,前\(i\)个数前缀和为\(j\)的方案数。显然,\(f_{0,0}=1\)。留意到如果\(j=0\),那么加入和不加入第\(i\)个数,最终的答案序列是一样的,因此此时加入第\(i\)个数对答......
  • Balanced Subsequences
    BalancedSubsequences注意子序列不一定连续。恰好最长合法括号子序列长度为\(2k\),那么废掉的)个数为\(m-k\)。恰好的方案数\(f_k\)不好求,我们可以求\(g_k\)表示长度至少为\(2k\)的方案数。(表示向上走,)表示向下走,\(g_k\)即为从\((0,0)\)走到\((n+m,n-m)\),且......
  • Balanced Subsequences
    首先知道结论:折现图上最低点的纵坐标为\(k-m\)。简单证明:考虑贪心这匹配过程(左括号+1,右括号-1),每次如果遇到向下的小于0的段,我们把其抹平,然后让后面所有点都+上某个值,最后一直这样操作,答案就是在y正轴上面的右括号/-1/下降个数。感性理解就是对于那个最低的在y负半轴......
  • CF1621G Weighted Increasing Subsequences 题解
    题目链接点击打开链接题目解法这种题就感觉每一步都不难想,但串在一起就不会显然考虑位置\(x\)作为\(lis\)的一部分,合法的\(lis\)的个数合法的约束是:令\(lis\)的最后一个位置为\(last\),满足\(\max\{a_{last+1},...,a_n\}>a_x\)不难发现,合法的\(last\)是一段区间......
  • 浙大数据结构:01-复杂度2 Maximum Subsequence Sum
    数据结构MOOCPTA习题01-复杂度2MaximumSubsequenceSum#include<iostream>usingnamespacestd;constintM=100005;inta[M];intmain(){ intk; cin>>k; intf=1; for(inti=0;i<k;i++) { cin>>a[i]; if(a[i]>=0)//如......
  • CF 2001 D. Longest Max Min Subsequence(*1900) 思维
    CF2001D.LongestMaxMinSubsequence(*1900)思维题目链接题意:给你一个长度为\(n\)的序列\(a\),设\(S\)是\(a\)的所有可能的非空子序列的集合,且没有重复的元素。你的目标是找出\(S\)中最长的序列。如果有多个序列,请找出将奇数位置上的项乘以\(−1\)后,使词序最小......
  • Strings, Subsequences, Reversed Subsequences, Prefixes
    题目大意给定两个字符串s和t,求出在s里面有多少个本质不同的子序列,使得该序列的前缀包含t,且该序列的反串也包含t即s的子序列=t+x+反t‘首先要确定是否有,就是判断我的S字符串中有没有包含T字符串for(l=0;l<n;l++){ if(s[l]==t[num])num++; if(num==m)bre......
  • CF568E Longest Increasing Subsequence 题解
    Description给定一个长度为\(n\)的有\(k\)个空缺的序列。你有\(m\)个数可以用于填补空缺。要求最大化最长上升子序列的长度。\(n,m\le10^5\),\(k\le10^3\)。Solution容易发现只需要先构造出LIS上的位置的值,对于其余未填位置随便填,所以构造LIS时就不需要考虑出......
  • P3131 [USACO16JAN] Subsequences Summing to Sevens S
    传送锚点:[USACO16JAN]SubsequencesSummingtoSevensS-洛谷题目描述FarmerJohn's\(N\)cowsarestandinginarow,astheyhaveatendencytodofromtimetotime.EachcowislabeledwithadistinctintegerIDnumbersoFJcantellthemapart.FJwould......
  • 题解:AT_abc352_d [ABC352D] Permutation Subsequence
    虽然比赛没打,但是想来水估值发表思路。题意给你一个\(1\simn\)的排列,让你从中找一段长为\(k\)的子序列,使得这个子序列中的元素排序后数值连续。分析题意转换一下,先用结构体存储每个元素的编号和数值,按照数值排序。于是这道题就成了:一个序列,让你求所有长\(k\)的子段中......