题意
起点(-无穷)终点(+无穷)中间有n个点,各有一个值,现想从起点到达终点,只能前行不能后退,且下一步必须比前面的点的值大,求所有走的点的值总和最大是多少。
思路
dp[i] = max(dp[k] + a[j]); 1<=k<=i-1;
最大递增子串和。
#include <cstring>
#include <iostream>
#define N 1005
#define INF 0x7f7f7f7f
using namespace std;
int val[ N ];
int dp[ N ];
int LIS ( int n ) {
int mx = 0;
for ( int i = 0; i < n; ++i ) {
dp[ i ] = val[ i ];
for ( int j = 0; j < i; ++j ) {
if ( val[ j ] < val[ i ] && dp[ i ] < dp[ j ] + val[ i ] )
dp[ i ] = dp[ j ] + val[ i ];
if ( mx < dp[ i ] )
mx = dp[ i ];
}
}
return mx;
}
int main () {
int n;
while ( ~scanf ( "%d", &n ) && n ) {
memset ( dp, 0, sizeof ( dp ) );
for ( int i = 0; i < n; ++i )
scanf ( "%d", &val[ i ] );
int sol = LIS ( n );
printf ( "%d\n", sol );
}
return 0;
}