E-Longest Increasing Subsequence
题目大意:
构造一个序列,要求序列中最长上升子序列的数量为n。
思路:
n可以用二进制表示成bk bk-1 …b1
对于bk,可以构造一个2 1 4 3 … 2*k 2*k-1这样一个序列,对于剩下的位bi,首先在序列2*i的位置后面插入一个大于2*k的数字,但是这样构造出来上升序列长度并不是k,因此还要在位置之后插入一个上升序列,这个上升序列的长度等于该位往上0的个数,选择合适的数,多个位置就能共用这个上升序列。
对于n=1、2、3的情况要进行特殊处理。
AC代码:
#include <bits/stdc++.h>
const int N = 1e2 + 5;
using namespace std;
vector<int> v[N], bits;
void solve()
{
for (int i = 0; i < N; i++)
v[i].clear();
bits.clear();
int n, m;
cin >> n;
m = n;
for (int i = 0; m; i++)
{
if (m & (1 << i))
{
bits.push_back(i);
m -= (1 << i);
}
}
if (n == 1)
cout << "2\n1 2\n";

本文介绍了如何使用动态规划和单调栈解决两类编程竞赛中的问题:E-LongestIncreasingSubsequence构造最长上升子序列数量为n的序列,以及I-TheGreatWallII寻找数列分段最小最大值之和。E-LongestIncreasingSubsequence通过分析二进制表示来构造序列,而I-TheGreatWallII利用单调栈维护状态,优化数列分段。两题都涉及到序列操作和状态转移的策略。
最低0.47元/天 解锁文章
756

被折叠的 条评论
为什么被折叠?



