首页 > 代码库 > hdu1087最长递增子序列
hdu1087最长递增子序列
原题地址
简单dp题,LIS。不同之处是这里要求得的不是最长的子序列,而是权重和最长的子序列。其实大同小异。
状态数组就是到达每个位置的最大权重。
LIS问题常用解法就是两个:
- 人人为我
- 我为人人
本题我用了我为人人的思路 。就是确定子序列起点,把其后面每一个大于它的值的位置的状态数组更新。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int a[1005],w[1005]; int main() { int n; while(cin>>n,n) { for(int i=0;i<n;i++) { cin>>a[i]; w[i]=a[i]; } for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(a[i]<a[j]) w[j]=max(w[j],w[i]+a[j]); } } cout<<*max_element(w,w+n)<<endl; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。