nyoj 单调递增最长子序列(贪心||DP)
来源:互联网 发布:嵌入式编程环境 编辑:程序博客网 时间:2024/05/20 09:44
单调递增最长子序列
如:dabdbf最长递增子序列就是abdf,长度为4
- 输入
- 第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 - 输出
- 输出字符串的最长递增子序列的长度
- 样例输入
3aaaababcabklmncdefg
- 样例输出
137
通过一个数组不断地记录递增子序列的最大长度。
代码:
#include<stdio.h>#include<string.h>int dp[10010];char a[10010];int main(){ int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int i,la,j,maxn=-1; scanf("%s",a+1); la=strlen(a+1); for(i=1;i<=la;i++) { for(j=i-1;j>=0;j--) { if(a[j]<a[i]&&dp[i]<dp[j]+1)//判断是否递增,并且判断当前元素所处递增序列的长度 dp[i]=dp[j]+1;//更新递增序列的最大长度 } if(dp[i]>maxn) maxn=dp[i]; } printf("%d\n",maxn); } return 0;}
方法二:
代码:
#include<stdio.h>#include<string.h>char a[10010];int main(){ int t; scanf("%d",&t); while(t--) { memset(a,'\0',sizeof(a)); int i,la,j,tot=0; scanf("%s",a); la=strlen(a); for(i=0; i<la; i++) { for(j=0; j<tot; j++) { if(a[j]>=a[i])//不断地依次更新递增子序列的较小值,以实现获取较长的递增子序列 { a[j]=a[i]; break; } } if(j==tot)//若出现一个大于当前最长递增子序列最大值的元素,更新递增子序列的长度,并更新递增子序列的最大值 { a[j]=a[i]; tot++; } } printf("%d\n",tot); } return 0;}
ps:不断地从一个递增子序列的最小元素开始更新此递增子序列的元素,若此轮并没有更新任何元素且j等于tot,说明又出现一个最大元素,此时应更新此递增子序列的长度,最后找到字符串中最长的递增子序列,
1 0
- nyoj 单调递增最长子序列(贪心||DP)
- NYOJ 题目17 单调递增最长子序列 (DP)
- NYOJ 17 单调递增最长子序列(DP)
- NYOJ - 单调递增最长子序列(经典dp)
- NYOJ 17 单调递增最长子序列 DP
- nyoj 17 单调递增最长子序列 【dp】
- NYOJ 17-单调递增最长子序列(典型DP)
- NYOJ-17 单调递增最长子序列 两种方法(动态规划,贪心+二分查找)
- NYOJ-17:单调递增最长子序列
- NYOJ 17 单调递增最长子序列
- NYOJ 17 单调递增最长子序列
- NYOJ 17-单调递增最长子序列
- nyoj-17-单调递增最长子序列
- NYOJ 17 单调递增最长子序列
- NYOJ 17 单调递增最长子序列
- NYOJ--单调递增最长子序列
- NYOJ 17 最长单调递增子序列
- nyoj 17 单调递增最长子序列
- 正则表达式(python)
- 矩阵 线性方程组 condition number
- IP分片和对TCP/UDP的影响
- 如何写一个不可变类?
- ACM输入格式
- nyoj 单调递增最长子序列(贪心||DP)
- IntelliJ IDEA使用教程
- spi_master.c
- Linux(centos)下使用护眼程序(f.lux)的办法
- Ultra-Pull-To-Refresh 和ViewPager冲突以及Android事件分发机制
- BeautifulSoup4入门
- cdh5.8 重装
- OS X Capitan 和 macOS Sierra U盘安装
- 微软等数据结构+算法面试100题全部答案集锦