Super Jumping! Jumping! Jumping!
题目是要求最长上升子序列的最大和。
主要是状态 f[i] 设为以元素 a[i] 结尾的最长上升子序列之和。
f[i] 如果想要更新状态的话,必须在元素 a[i] 前面找一个比它自己小的 a[j] 这一段再加上a[i]
f[i]=max(a[i],f[j]+a[i]);(j<i)
最后求最大值就好了。
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<set> 7 #include<algorithm> 8 #include<cmath> 9 #include<cstdlib> 10 using namespace std; 11 int n, a[1100], f[1100],ans=0; 12 int main() 13 { 14 while (scanf("%d", &n)) 15 { 16 if (n == 0) break; 17 for (int i = 1; i <= n; i++) 18 scanf("%d",&a[i]); 19 for (int i = 1; i <= n; i++) 20 { 21 f[i] = a[i]; 22 for (int j = 1; j < i; j++) 23 if (a[i] > a[j]) 24 f[i] = max(f[i],f[j]+a[i]); 25 } 26 ans = 0; 27 for (int i = 1; i <= n; i++) 28 ans = max(ans,f[i]); 29 printf("%d ",ans); 30 } 31 return 0; 32 }