题目:Super Jumping
题意:一个棋盘和一些旗子,棋子有大小的整数数字或者开始或者结束,在整个过程中不能后退,且整数比递 增,求最大数和
思路:类似最大递增子段,只不过这里求的是到第i个元素时,其最大递增子段的和dp[i]。输出最大的那个值k。
感想:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j,a[i]<a[j]
代码:
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[10005];
int dp[10005];
int n,i,j,k,s;
while(cin>>n&&n!=0)
{
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
s=-32768;
for(j=0;j<i;j++)
{
if(a[i]>a[j])
{
s=max(s,dp[j]);
}
}
dp[i]=s+a[i];
}
int k=-32768;
for(i=1;i<=n;i++)
{
if(dp[i]>k ) k=dp[i];
}
cout<<k<<endl;
}
return 0;
}
本文介绍了一种类似于最长递增子序列的问题——SuperJumping。通过动态规划的方法,求解在一个给定序列中,找到满足条件的最大数值和。具体实现包括输入处理、状态转移方程的定义以及最终结果的输出。
486

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



