1、P1028魔族密码 :https://vijos.org/p/1028

分析:最长不下降子序列的变形, 把数字类比成前缀问题

#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>using namespace std;const int maxn=2005;
string word[maxn];
int a[maxn],s[maxn];bool cmp(int i,int j)   //比较是否为前缀
{int len=word[j].size();for (int k=0;k<len;k++)if (word[j][k] != word[i][k]) return false;return true;
}int main()
{int n;scanf("%d",&n);for (int i=0;i<n;i++){cin>>word[i];s[i]=word[i].size();}a[0]=1;for (int i=1;i<n;i++)  //LIS模板{for (int j=0;j<i;j++){if (cmp(i,j))a[i]=max(a[i],a[j]);}a[i]++;}int ans=0;for (int i=0;i<n;i++)ans=max(a[i],ans);printf("%d",ans);return 0;
}
2、合唱队形  https://vijos.org/p/1098
分析:左右分别进行两遍LIS便可(入门题)
#include <cstdio>
#include <iostream>using namespace std;const int maxn=1005;int main(){int f1[maxn],f2[maxn],a[maxn];int n;scanf("%d",&n);for (int i=0;i<n;i++)scanf("%d",&a[i]);for (int i=0;i<n;i++){f1[i]=1;f2[i]=1;}for (int i=1;i<n;i++)for (int j=0;j<i;j++)if (a[i]>a[j]) f1[i]=max(f1[i],f1[j]+1);for (int i=n-2;i>=0;i--)for (int j=n-1;j>i;j--)if (a[i]>a[j]) f2[i]=max(f2[i],f2[j]+1);int sum=0;for (int i=0;i<n;i++)sum=max(sum,f2[i]+f1[i]-1); //每个数被重复计数一次,应-1sum=n-sum;printf("%d",sum);return 0;}
3、P1369难解的问题  https://vijos.org/p/1369
分析:分别求2次LIS(第一次:以第K项为结尾(一定要包含第K项)的最长LIS+
                    第二次:以第K项为开始(一定要包含第K项)的最长LIS)
注意的地方:要用长整型,二分查找的修改由temp>=dp[mid].num修改为temp>dp[mid].num
因为例如数据 14 3
0 0 0 6 8 4 5 6 7 9 8 9 5 10
注意观察前三项在DP时的变化。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int maxn=300005;struct Node
{long long num;
};Node dp[maxn];int main()
{int n,k,len=0;long long tmp;scanf("%d%d",&n,&k);dp[0].num=-1;int top=0;for (int i=1;i<=k;i++){scanf("%lld",&tmp);if (tmp > dp[top].num){dp[++top].num=tmp;if (i == k){len=top;}}else{int l=1,r=top;int mid;while (l <= r){mid=(l+r)/2;if (tmp > dp[mid].num){l=mid+1;}else{r=mid-1;}}dp[l].num=tmp;if (i == k)len=l;}}top=1;dp[top].num=tmp;for (int i=k+1;i<=n;i++){scanf("%lld",&tmp);if (tmp>dp[top].num){dp[++top].num=tmp;}else{int l=1,r=top;int mid;while (l <= r){mid=(l+r)/2;if (tmp > dp[mid].num){l=mid+1;}else{r=mid-1;}}if (l!=1){dp[l].num=tmp;}}}printf("%d\n",top+len-1);return 0;
}

4、P1474雷曼兔(csapc) https://vijos.org/p/1474
分析:LIS的变形,题目告诉只能出现1~n的内的数,切每个数都得出现一次。。。倒序LIS一次,计算最大的华丽度总和即可
//v=(|x1-x2|+|y1-y2|)^2#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>using namespace std;struct node
{int x,y,score;
};int poww(node a,node b)
{return (abs(a.x-b.x)+abs(a.y-b.y))*(abs(a.x-b.x)+abs(a.y-b.y));
}node sum[2501];int main()
{int n,a;scanf("%d",&n);for (int i=0;i<n;i++)for (int j=0;j<n;j++){scanf("%d",&a);sum[a].x=i;sum[a].y=j;}for (int i=n*n-1;i>=1;i--)   // 逆序LISfor (int j=i+1;j<=n*n;j++){int p=poww(sum[i],sum[j]);sum[i].score=max(sum[j].score+p,sum[i].score);}printf("%d\n",sum[1].score);return 0;
}
5、P1571笨笨的导弹攻击    https://vijos.org/p/1571
分析:使得这些被抽取出来的导弹奇数位置的编号大于其前一个的编号,偶数位置的编号小于其前一个的编号,这样子才能够正常使用这些导弹攻击目标
用f[ i ] 表示到第i个导弹时,最大可击中目标的导弹数,由题意知,需考虑奇数和偶数情况,接着LIS即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int maxn=10005;
int a[maxn],f[maxn];int main()
{int n;scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&a[i]);for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++){if (f[i]%2==1){      //奇数情况if (a[j]>a[i]) f[j]=max(f[j],f[i]+1);}else if(f[i]%2==0)   //偶数情况if (a[j]<a[i]) f[j]=max(f[j],f[i]+1);}int ans=0;for (int i=1;i<=n;i++)ans=max(ans,f[i]);cout<<ans+1<<endl;return 0;
}

6、P1264神秘的咒语   https://vijos.org/p/1264
分析:基于LCS的LIS,LICS,最长不下降公共子序列。。。
dp[ i ] [ j ] 表示 第一串前 i 个 和 第二串前 j 个 并且以b[ j ] 为结尾的 LICS
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int maxn=505;dp[i][j] 表示 第一串前i个, 第二串前j个 并且以b[j]结尾 的最大公共子序列int a[maxn],b[maxn];
int dp[maxn][maxn];int main()
{int t;scanf("%d",&t);while (t--){int n,m;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);scanf("%d",&m);for (int i=0;i<m;i++)scanf("%d",&b[i]);memset(dp,0,sizeof(dp));for (int i=0;i<n;i++){int _max=0;for (int j=0;j<m;j++){dp[i+1][j+1]=dp[i][j+1];if (a[i] > b[j]){_max=max(_max,dp[i][j+1]);}if (a[i] == b[j]) dp[i+1][j+1]=_max+1;}}int ans=0;for (int i=1;i<=m;i++)ans=max(ans,dp[n][i]);printf("%d\n",ans);}return 0;
}

Vijous系列(1)LIS 最长不下降子序列的应用相关推荐

  1. 【P2766】 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  2. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  3. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...

  4. P2766 最长不下降子序列问题(网络流)

    P2766 最长不下降子序列问题 求解LIS长度k 求解长度为k的不下降子序列个数,并且一个数只能使用一次 求解长度为k的不下降子序列个数,第一个数和第n个数可以使用任意次 首先利用dp可以求解出以每 ...

  5. NLOG 最长不下降子序列

    LIS有N2的算法,还有NLOGN的算法,这里说一下NLOGN的算法. 我们设S[]为原始序列,F[i]为以S[i]结束的LIS的最大长度.在求LIS时,对于S[i],我们找一个最大的可能的F[j], ...

  6. 最长不下降子序列(推广问题)

    最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...

  7. 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)

    题目链接 最多不相交路径 这种问题变化比较多,但都能表示成以下形式: 已知一些路径,每个节点只能属于一条路径,求能选择多少条路径使它们不相交. 主要的方法是拆点,将一个点拆成两个,然后连边,容量表示该 ...

  8. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  9. 洛谷2766:[网络流24题]最长不下降子序列问题——题解

    https://www.luogu.org/problemnew/show/P2766 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出 ...

最新文章

  1. NC:菌物组构建---随机性v.确定性、干旱胁迫、宿主筛选、统一动态(郭良栋、杨军点评)
  2. Eclipse Open J9:Eclipse OMR项目提供的开源JVM
  3. “下沉市场”+“内容生态”,OTA的两道救命题?
  4. linux下通过rsync+inotify 实现数据实时备份(远程容灾备份系统)
  5. rbw数字信号处理_数字信号处理与模拟IC设计
  6. tomcat 错误页面html,Nginx整合Tomcat后配置友好错误界面
  7. db2 控制台执行创建函数语句_DB2 从命令行创建SQL存储过程
  8. C#基础4:函数+ref和out参数
  9. 车载主机企业对Android平台趋之若骛
  10. 更改网页alert弹出框样式
  11. uniapp安卓app里拦截webview下载apk,显示下载进度
  12. openvswitch console输出
  13. 【ValueError: could not convert string to float: ‘young‘】python利用pandas对string类型的数据序列化
  14. 从零写一个操作系统之booting
  15. 北京 上海 天津 河北 融资性担保机构经营许可证
  16. 4k纸是几厘米乘几厘米_4k纸多大,纸张的大小规格
  17. MindMapper的使用技巧分享
  18. android 字符串转小数点,Android实现计算器(计算表达式/计算小数点以及括号)...
  19. mysql minus 语句用法_mysql如何用minus运算符?
  20. hana服务器销售资质,hana认证服务器

热门文章

  1. diff/patch命令以及quilt工具的使用
  2. Docker安装Redis(普通安装+在线安装+离线安装)
  3. 算法笔记-问题 A: 【字符串】最长回文子串
  4. Flink 对于迟到数据的处理
  5. 如何回答:你有什么样的职业规划
  6. 梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第五次培训
  7. WoldPress从0开始建站(二):大哥你看我美不美
  8. QQ输入账号缓慢 无法登陆 错误码0x00060008
  9. VMware NSX-T搭建及配置
  10. 阿甘正传台本_阿甘正传与愚蠢与简单的区别