看来大佬的dp思路,在这里就简单的总结下吧。
拿到一个问题,先得考虑是否适用dp算法。
1,找到最优解的结构,看其子问题是否也满足最优化(子问题最优化问题)
2, 看时候有子问题重叠
确定一个问题可以用dp来解决以后开始分析
1,用递归的定义来划分解的结构。
2,选择合适的数据结构来存放子问题的最优解。
3,按怎样的顺序去存放子问题。
dp[i]表示的是以i为结尾的最长上升和的长度,dp[i]的递归定义 =max(dp[j]+a[i]) //a[i] 为数组里面的值 j的范围为1~i a[j]<a[i],这里只有一个维 数据结构选用一位顺序数组就可以了。代码如下:
#include<iostream> #include<cstring> #include<cstdio> #define inf 1<<29 using namespace std; int main() { cin.sync_with_stdio(false); int n; int a[1001]; while(cin>>n) { if(n==0) break; for(int i=1;i<=n;i++) cin>>a[i]; int dp[1001]; memset(dp,0,sizeof(dp)); //dp[1]=a[1]; int maxn=-inf; for(int i=1;i<=n;i++) { int sum=0; for(int j=1;j<i;j++) { if(a[j]<a[i]&&sum<dp[j]) sum=dp[j]; } dp[i]=sum+a[i]; if(maxn<dp[i]) maxn=dp[i]; } cout<<maxn<<endl; } return 0; }