这题错的莫名其妙

#include <iostream>

#include <stdio.h>

#include <string.h>

#include <algorithm>

#define MAXN 1000+5

using namespace std;

int a[1005];

int dp[1005];

int main(void)

{

         intn;

         while((scanf("%d",&n))==1&&n)

         {

         for(inti=1;i<=n;i++)

         {

                   scanf("%d",&a[i]);

                   dp[i]=a[i];

         }

         for(inti=2;i<=n;i++)

         {

                   intmmax=-99999;

                   for(intj=1;j<i;j++)

                   {

                            if(a[j]<a[i]&& a[j] >= mmax)

                            {

                                     mmax= a[j];

                            }

                   }

                   //printf("%d-",index);

                   if(index!=-1)

                   dp[i]+=dp[index];

                   //printf("%d-",dp[i]);

         }

         int  mmax=-999999;

         for(inti=1;i<=n;i++)

         {

                   if(dp[i]>mmax)

                            mmax=dp[i];

         }

         printf("----%d\n",mmax);

         }

}


AC了,发现还是思维错了,求的应该是 a[i] < a[i] 中 DP 最大的 ,而不是 a[j] < a[i] 中,,最大的数,, 对应的  DP 。 比如例子  7 1 2 3 4 5 6 8  如果按照上面的会输出 15 ,然而应该是 1+2+3+4+5+6+8 是最大值 。    这题可以简单的说,我只要找出比 a [i] 小的d[j]集合中  , dp最大的那个 。。 必定满足每次都是最大,那么dp[1~n] 每一个都是最优的情况,那么推出  dp[n]就是最优的情况. 就满足了最优子解的问题。再者考虑 无后效性 ,  前面我选择了什么,只能通过当前的状态去影响后面的状态,而不能持续的影响以后的状态,  我通过哪个dp  找到当前的 dp[i] 无所谓(4  3 1 5,DP[4]无论是从4→5还是3→1→5,对于5后面的DP没有任何影响),我只要找到DP最大的,并且小于a[i]的就满足要求就可以。 ````````` 也就这么粗浅的理解了,还需要多做题来理解题目意思`````。动态规划就是说要求 每一个DP 都是 最优,每一个DP都是由前面的最优DP推出来,当前的求得的DP由前面最优的DP求出来,当前的DP也就是最优的,每一个DP是最优的,最终所求的DP[N]就是最优解了1!!!!!。 这题和最长上升序列几乎一样

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<algorithm>

#define MAXN 1000+5

using namespacestd;

int a[10005];

int dp[10005];

int main(void)

{

    int n;

    while((scanf("%d",&n))==1&&n)

    {

    for(int i=1;i<=n;i++)

    {

       scanf("%d",&a[i]);

       dp[i]=a[i];

    }

    dp[1]=a[1];

    for(int i=2;i<=n;i++)

    {

       int mmax=0;

       int index=-1;

       for(int j=1;j<i;j++)

       {

           if(a[j]<a[i] && dp[j]>= mmax)

           {

              mmax = dp[j];

              index = j;

           }

       }

       //printf("%d-",index);

       dp[i]+=mmax;

       //printf("%d-",dp[i]);

    }

    int mmax=-999999;

    for(int i=1;i<=n;i++)

    {

       //printf("%d-",dp[i]);

       if(dp[i]>mmax)

           mmax=dp[i];

    }

    printf("%d\n",mmax);

    }

}