纠结了很久,总算看懂了!留作纪念,dp问题实在有点抽象
#include<iostream>
using namespace std;
int max(int x,int y)
{ return x>y?x:y; }
int main()
{
int dp[1001],a[1001],n,i,j,tot,maxx;
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=0;
}
tot=0;
for(i=0;i<n;i++)
{
maxx=0;
for(j=0;j<=i-1;j++)
{
if(a[i]>a[j]&&dp[j]>maxx)
maxx=dp[j]; //找出a[i]前面的比a[i]小的最大的那个!
}
dp[i]=a[i]+maxx; //记载每个a[i]相对应的那个位置能达到的最大值
tot=max(tot,dp[i]); //找出dp中最大的给tot;
}
cout<<tot<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int max(int x,int y)
{ return x>y?x:y; }
int main()
{
int dp[1001],a[1001],n,i,j,tot,maxx;
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=0;
}
tot=0;
for(i=0;i<n;i++)
{
maxx=0;
for(j=0;j<=i-1;j++)
{
if(a[i]>a[j]&&dp[j]>maxx)
maxx=dp[j]; //找出a[i]前面的比a[i]小的最大的那个!
}
dp[i]=a[i]+maxx; //记载每个a[i]相对应的那个位置能达到的最大值
tot=max(tot,dp[i]); //找出dp中最大的给tot;
}
cout<<tot<<endl;
}
return 0;
}