Super Jumping! Jumping! Jumping!
本人也是刚开始学习dp的题,做完了数塔就来做子串,看了好久才看懂。
思路详见代码:
状态方程:dp[i]max(dp[i],dp[j]+a[i])
#include<stdio.h>
int main()
{
int a[1005];
int dp[1005];
long long sum;
int n;
while(scanf("%d",&n),n)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sum=dp[0]=a[0];
for(int i=1;i<n;i++)
{
dp[i]=a[i];//初始化状态,每一个都和a[]一样
for(int j=0;j<=i;j++)//在本循环内从j=0到i能直接跳到(即第一个if)i位置的j去最优(第二个if)。
{
if(a[i]>a[j])
if(dp[i]<dp[j]+a[i]) //dp[i]max(dp[i],dp[j]+a[i])状态方程
dp[i]=dp[j]+a[i];
}
if(sum<dp[i])
sum=dp[i];
}
printf("%I64d\n",sum);
}
return 0;
}
1229

被折叠的 条评论
为什么被折叠?



