原题地址
简单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; } }