标签:c style class blog code tar
【题目大意】
首先给你一个数n,然后给你n个数,现在要你从这n个数字中找一个上升子序列使得这些子序列的和最大。
【题目分析】
简单dp,求最大上升子序列。
首先我们得设两个数组a[1010]和dp[1010]。a[1010]存放输入的数列,dp[1010]用来存放从开始到当前的最大上升子序列:
状态转移方程为: dp[i]=a[i]+max(dp[j]&&a[j]<a[i]&&0<=j<i);
代码很简单:
#include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; #define INF -999999 int n,a[1010],dp[1010]; int main() { while(scanf("%d",&n),n) { scanf("%d",&a[0]); dp[0]=a[0]; for(int i=1;i<n;i++) { scanf("%d",&a[i]); int max=INF; bool find=0; for(int j=0;j<i;j++) { if(a[j]<a[i]) { if(dp[j]>max) { max=dp[j]; find=1; } } } if(find==1) dp[i]=a[i]+max; else dp[i]=a[i]; } int ans=INF; for(int i=0;i<n;i++) if(dp[i]>ans) ans=dp[i]; printf("%d\n",ans); } return 0; }
标签:c style class blog code tar
原文地址:http://www.cnblogs.com/acmer-jsb/p/3760055.html