(p226)最长单调递增子序列
2016-03-25 14:28
190 查看
#include<stdio.h> #define max 100 int LS(int a[],int f[],int d[],int next[],int n) { int i,j; f[0]=1; for (i=1;i<n;i++) f[i]=0;//初始化值<=1都可以 d[0]=0; for (i=0;i<n;i++) { for (j=0;j<i;j++) if (a[i]>=a[d[j]]) { f[i]=f[j]+1>f[i]?(next[i]=j,f[j]+1):f[i]; d[i]=i; } else { f[i]=f[j]>f[i]?(d[i]=d[j],next[i]=j,f[j]):f[i]; } } return f[n-1]; } int printLS(int a[],int next[],int d[],int n) { int l=n; if (d[l]==l) printf("%d ",a[l]); while (1) { printf("%d ",a[next[l]]); if (d[l]==1) break; l=next[l]; } printf("\n"); return 0; } int main(void) { int a[max]={8,34,11,39,0,27,56,42,95,56,13},f[max],d[max],next[max],n=11,ans;/*next为跳转表,用来构建LS,需要注意的是,对于前面的元素均比自己大的情况已经是LS的开头*/ ans=LS(a,f,d,next,n); printf("%d\n",f[n-1]); int i; for (i=0;i<n;i++) printf("%d ",f[i]); printf("\n"); for (i=0;i<n;i++) printf("%d ",d[i]); printf("\n"); printLS(a,next,d,n-1); return 0; }
相关文章推荐
- 【LeetCode】273. Integer to English Words
- 表单
- C++ Primer in one article
- Alluxio源码分析:RPC框架浅析(一)
- 你真的会写简历么?
- 装oracle,~/.bash_profile注意事项
- 个人简历
- Python 操作Redis
- 先到先得!买老男孩课程送亲笔签名新书啦!
- java 变量的命名,get和set方法的问题
- ActiveMQ测试工具
- iOS学习之路(一)--开篇:学习纲领
- 如何在移动设备上调试html5开发的网页
- Dubbo基础篇_04_使用Maven构建Dubbo服务可执行jar包
- 查询服务端口
- layer 模态窗口基本问题
- HBuilder开发App教程
- tomcat服务器配置远程调试
- 【线性代数】正交投影
- 利用 ipset 封禁大量 IP