//设上升序列的最后一个数字为第i个,那么就以第i-1个位分类标准,
//i-1可以没有,也可以是在数组中下标为1,下标为2
//一直到下标为i-1的数字
#include <iostream>
#include <algorithm>
using namespace std;
const int N = ;
int n;
int a[N], f[N];
int main() {
scanf("%d", &n);
for (int i = ; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = ; i <= n; i ++ ) {
f[i] = ; // 开始假设有a[i]一个数
for (int j = ; j < i; j ++ )
if (a[j] < a[i])//是否满足上升
f[i] = max(f[i], f[j] + );
}
int res = ;
for (int i = ; i <= n; i ++ ) res = max(res, f[i]); printf("%d\n", res); return ;
}

输出路径

#include <iostream>
#include <algorithm>
using namespace std;
const int N = ;
int n;
int a[N], f[N];
int g[N];//存储每一个转移是怎么转移过来的,每一个转移是怎么做出来的
int main() {
scanf("%d", &n);
for (int i = ; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = ; i <= n; i ++ ) {
f[i] = ; // 开始假设有a[i]一个数
g[i]=;//如果为0,表示只有一个数
for (int j = ; j < i; j ++ )
if (a[j] < a[i])//是否满足上升
if(f[i]<f[j]+) {
f[i]=f[j]+;
g[i]=j;//i状态是从j状态转移过来的
}
}
int k=;//记录最优解的下标
for(int i=; i<=n; i++)
if(f[k]<f[i])
k=i;
cout<<f[k]<<endl;//输出最大长度
for(int i=,len=f[k]; i<len; i++) {//一共f[k]个值
cout<<a[k]<<" ";//因为f[k]是以第k个数字结尾的序列,所以先把第k个输出
k=g[k];//从哪个转移过来
}
return ;
}

最新文章

  1. nodeschool.io 4
  2. C#容易忽略點--包含多線程 委託事件等等--此頁面bug,編輯能查看全部內容
  3. 九度OJ 1362 左旋转字符串(Move!Move!!Move!!!)【算法】
  4. Android Weekly Notes Issue #238
  5. webApi项目中的问题
  6. HEVC测试序列(百度云网盘分享)
  7. 2015.4.7-C#入门基础(一)
  8. Juqery遮罩插件
  9. 负载均衡 Lvs nat 模式笔记
  10. Ninject之旅目录
  11. JSF页面中使用js函数回调后台action方法
  12. java笔记 -- 类与对象
  13. leetcode96
  14. 【九天教您南方cass 9.1】 14 坐标数据的纠正
  15. C语言注意点汇总
  16. Oracle_spatial的空间索引
  17. EMS_PM_STORAGE
  18. 字符编码笔记:ASCII,Unicode和UTF-8(转载)
  19. Javascript获取当月的天数
  20. 2015年传智播客JavaEE 第168期就业班视频教程day45-ERP项目-0107-其他子系统

热门文章

  1. es6简单小复习
  2. Jekyll 摘要
  3. LOJ#6038. 「雅礼集训 2017 Day5」远行 [LCT维护子树的直径]
  4. 用cookie存值
  5. H5_0018:z-index失效的原因
  6. 375. 猜数字大小 II
  7. 获取redis指定实例中所有的key
  8. SpringBoot之spring.factories
  9. linux 配置compoer
  10. unicode 地址