hdu 5256 最少修改多少个数 能使原数列非严格递增增

Problem Description
Sample Input
Sample Output
一开始只知道要满足a[i]-a[j] &= i-j才可以用LIS,然后对upper_bound各种改写,还是不行,然后对排序各种想。。。最后看到前辈的博客才知道将不等式换一下:a[i]-i&=a[j]-j就可以了。
#include &cstdio&
#include &iostream&
#include &algorithm&
const int MAXN = 101000;
const int INF = 1e8;
int t, n, g[MAXN], ar[MAXN], dp[MAXN];
int main() {
scanf(&%d&, &t);
int cnt = 0;
while (t--) {
scanf(&%d&, &n);
for (int i = 1; i &= i++) {
scanf(&%d&, &ar[i]);
ar[i] -= g[i] = INF;
int ans = 0;
for (int i = 1; i &= i++) {
int k = upper_bound(g + 1, g + 1 + n, ar[i]) -
dp[i] = g[k] = min(g[k], ar[i]);
ans = max(ans, dp[i]);
printf(&Case #%d:\n%d\n&, ++cnt, n - ans);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4805次
积分:1985
积分:1985
排名:第14030名
原创:194篇
(82)(60)(4)(2)(11)(16)(18)(6)题目:思路: 修改数量最少的元素使得这个数列严格递增,等价于让数量最多的元素不变,然后修改其余的元素。也就是从序列里面选尽量多的数,使得其它数修改后能形成一个单调递增序列。这跟LIS很像,不过多了个限制,我们尝试用数学式子来描述这个限制,a[i]-a[j]&=i-j,i&j,a[i],a[j]∈LIS,变形就是a[i]-i&=a[j]-j。一种自然的想法就产生了,将原序列做个变换,a[i]-&a[i]-i,然后对新序列求最长非降序列,那么最长非降序列里的数的个数就是不变的数的最大个数,用n减去就是答案。123456789101112131415161718192021222324252627282930313233343536373839#pragma&comment(linker,&"/STACK:40000")#include&&iostream&#include&&cstdio&#include&&cstring&#include&&cstdlib&#include&&vector&#include&&algorithm&#include&&queue&using&namespace&&int&dp[123456],&n,&a[123456];&int&LIS(int&*from,&int&*to)&{&&&&dp[0]&=&-1e9;&&&&for&(int&i&=&1;&i&&=&n;&i&++)&dp[i]&=&1e9;&&&&int&ans&=&0;&&&&for&(int&*pint&=&&pint&&&&pint&++)&{&&&&&&&&int&pos&=&upper_bound(dp,&dp&+&n,&*pint)&-&dp&-&1;&&&&&&&&dp[pos&+&1]&=&min(dp[pos&+&1],&*pint);&&&&&&&&ans&=&max(ans,&pos&+&1);&&&&}&&&&return&}int&main()&{#ifndef&ONLINE_JUDGE&&&&freopen("in.txt",&"r",&stdin);#endif&//&ONLINE_JUDGE&&&&int&T,&cas&=&0;&&&&cin&&&&T;&&&&while&(T&--)&{&&&&&&&&cin&&&&n;&&&&&&&&for&(int&i&=&0;&i&&&n;&i&++)&{&&&&&&&&&&&&scanf("%d",&a&+&i);&&&&&&&&&&&&a[i]&-=&i;&&&&&&&&}&&&&&&&&printf("Case&#%d:\n%d\n",&++&cas,&n&-&LIS(a,&a&+&n));&&&&}&&&&return&0;}
阅读(...) 评论()将整数填入如图所示的行列的表格中,使每一行的数字从左到右都成递增数列,则第三列各数之和的最小值为,最大值为.;因为第3列前面有两列,共有10个数分别小于第3列的数,因此:最小为:3+6+9+12+15=45.因为第3列后面有两列,共有10个数分别大于第3列的数,因此:最大为:23+20+17+14+11=85.北京市朝阳区2013届高三上学期期末考试数学理试题答案
因为第列前面有两列,共有个数分别小于第列的数,因此:最小为:因为第列后面有两列,共有个数分别大于第列的数,因此:最大为:相关试题hdu 5256 序列变换 (LIS变形)
Time Limit:
MS (/Others) Memory Limit:
K (Java/Others)
Total Submission(s): 519 Accepted Submission(s): 245
Problem Description 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。
请输出最少需要修改多少个元素。
Input 第一行输入一个T(1&T&10),表示有多少组数据
每一组数据:
第一行输入一个N(1&N&105),表示数列的长度
第二行输入N个数A1,A2,...,An。
每一个数列中的元素都是正整数而且不超过106。
Output 对于每组数据,先输出一行
然后输出最少需要修改多少个元素。
Sample Input
Sample Output
非严格递增时,只需要求最长不降子序列就行了;严格上升,就需要求a[i]-i序列的最长LIS; a[j]-a[i]&j-i,即是两个元素不改变需要满足两数之差大于下标之差。
#define N 100005
#define LL __int64
int fun(int n)
int i,t,cnt=0;
for(i=0;i&&
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 最长递增子序列 hdu 的文章

 

随机推荐