hdu 1231最长子序列和

http://acm.hdu.edu.cn/showproblem.php?pid=1231

。。。。以前一直以为有点理解动态规划,没想到比自己想想的还要弱逼伤自尊。

不过总算写出来了。

这道题首先注意,最后要求输出的是,最大和,最大和所对应的最左元素和最右元素而不是最左序号和最右序号。

既然还要输出最左、右元素只要往右动归一次往左动归一次就好了,不过必须在往左动归之前把数据重新清0.

代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int N;
int a[10050];
int ans=-1;
int ansk1=0;
int ansk2=N-1;
int dp[10050];
int main()
{
    while(scanf("%d",&N)&&N)
    {
        int i;
        for(i=0;i<N;i++)
        {
            scanf("%d",&a[i]);
        }
        int j,t,k;
        dp[0]=a[0];
        for(j=1;j<N;j++)
        {
            int flag=0;
            dp[j]=max(dp[j-1]+a[j],a[j]);
            if(ans<dp[j])
                {
                    ans=dp[j];
                    ansk1=j;
                }
        }
        ans=0;
        dp[N-1]=a[N-1];
        for(j=N-2;j>=0;j--)
        {
            dp[j]=max(dp[j+1]+a[j],a[j]);
            if(ans<dp[j])
                {
                    ans=dp[j];
                    ansk2=j;
                }
        }
        printf("%d %d %d\n",ans,a[ansk1],a[ansk2]);
    }
    return 0;
}


思考:  dp[j]=max(dp[j-1]+a[j],a[j]);为什么可以?以及,为什么第二个是a[j]?

动归过程中始终保持最优子结构,所以dp[j-1]必然最优,那么想要继续最优下去,要么是把下一个元素加上去,要么抛弃当前的最优(因为前子序列的最优未必是父序列的最优的一部分),重新开一个,(也即子是父的一部分,是或否,选择或不选择)。那么问题来了,有没有可能子的一部分是父的最优的一部分?反对,如果a[j]被选择,说明子不如父优,而又选择子的一部分,说明子的整体不如子的一部分优,矛盾。总之,牢牢记住最优子结构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值