题意:
给定n个数的序列, 找出最长上升子序列和。
分析:
#include<cstdio> #include<iostream> #include<queue> #include<cstring> #include<string> #include<map> #include<vector> #include<algorithm> #include<cmath> #define rep(i,a,b) for(int i = a; i < b; i++) #define _rep(i,a,b) for(int i = a; i <= b; i++) using namespace std; const int inf = 1e9 + 7; int a[3000 + 7], dp[3000 + 7], n; int main() { // freopen("1.txt", "r", stdin); while(cin >> n && n){ memset(dp, 0, sizeof(dp));//dp数组含义是以i为结束的最长上升子序列的最大值 rep(i,0,n){ cin >> a[i];dp[i] = a[i]; } int ans = -inf; rep(i,0,n){ rep(j, 0 ,i){ if(a[i] > a[j]){ dp[i] = max(dp[i] , dp[j] + a[i]);//这里的最大值, 要么就是原来dp[j]的值加上a[i] //要么就是dp[i]本身(dp[j]只有加上a[i]才能转移到dp[i]) } ans = max(ans, dp[i]); } } // rep(i,0,n) ans = max(ans, dp[i]); //其实这里没必要, dp[i]每次更新后都是最优 printf("%d ", ans); } }