51nod 1294 修改数组(dp,逆向思维,最大上升子序列)
来源:互联网 发布:淘宝双11海报素材 编辑:程序博客网 时间:2024/05/18 02:48
------------------------------------看别人的代码写得题解---------------------------------------
这个题和那个最大上升子序列很像,就是不是严格递增的最大上升自序列。首先应该去想如果a[i]-i小于0,必须要改,因为这个是按照严格的递增来排列的。剩下的就要找不是严格递增的最大上升自序列。用n-最大上升自序列,就是答案。
如果自己去想肯定很难想到了,如果看了答案又会感觉很简单的啦。如果a[i]都减去i,不是严格递增的最大上升自序列一定就是不用改变值的个数,其他的数第i位只需要改变成i就够了。
----------------------------------------自己的感想-------------------------------------------------------
这就是逆向思维了,只听别人说答案怎么地怎么地,下次就能做出来?不存在的。你想的去求不改变的个数是多少。先去掉必须改变的个数,然后去求不是严格递增的最大上升自序列,这个是最大的不用改变的数,应该能看懂。其他的数第i位只需要改变成i就够了。
#include <bits\stdc++.h>using namespace std;#define fo(i,a,b) for(i=a;i<=b;i++)const int maxn=1e5+7;int i,j,k,l,t,n,m,ans,r,mid;int a[maxn],f[maxn],b[maxn];int main(){ scanf("%d",&n); fo(i,1,n)scanf("%d",&a[i]),a[i]-=i,f[i]=1e9+2; fo(i,1,n){ if(a[i]>=0)b[++b[0]]=a[i]; } ans=0; for(int i=1;i<=b[0];i++) { int tmp=lower_bound(f+1,f+1+ans,b[i])-f; while(b[i]==f[tmp])tmp++; f[tmp]=b[i]; ans=max(tmp,ans); } printf("%d\n",n-ans);}
阅读全文
0 0
- 51nod 1294 修改数组(dp,逆向思维,最大上升子序列)
- EOJ1109 dp最大上升子序列
- OpenJudge_P3532 最大上升子序列和(DP)
- 51nod-1134最长上升子序列
- 51nod 1134 【最长上升子序列】
- 51nod 1050 循环数组最大子段和(思维)
- 最大上升子序列
- 最大上升子序列
- 最大上升子序列
- 最大上升子序列
- 51nod 循环数组最大子段和 (dp)
- 51nod 1050 循环数组最大子段和 dp
- HDU 1257 (最大上升子序列)
- 最大上升(下降)子序列 小节
- hdu1087最长(最大)上升子序列
- 最大上升子序列LIS(Java)
- 【最长上升子序列】51 nod 最长单增子序列
- 51nod 1294 修改数组 dp
- window10 下安装java开发环境步骤(jdk,maven,idea,MySQL,navicat,tomcat)
- 1036: 递归6(统计出栈
- 2017年10月07日普及组 数列
- namenode多个工作目录解决数据丢失问题
- 设计模式-行为-职责链
- 51nod 1294 修改数组(dp,逆向思维,最大上升子序列)
- OpenGL中矩阵堆栈为什么要进行多次的压栈和出栈操作?
- Android问题集锦:Eclipse 中文乱码之解决
- 排序算法—Java实现
- dom4j对XML的读写
- 1481. 偷懒的西西
- window.opener方法的使用 js跨域
- MAC上编写汇编程序
- 大学生职业规划