动态规划1:状态转移方程-求最大子序列和

时间复杂度O(n)
序列:-2 11 -4 13 -5 -2

//最大连续子序列和
//使用到状态转移方程
#include <cstdio>
#include "algorithm"
using namespace std;
const int maxn =10010;
int A[maxn],dp[maxn];//A存放数字序列  dp存放以A[i]结尾的连续序列最大和

int main() {
    int n;
    scanf("%d\d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&A[i]);
    }
    //边界
    dp[0]=A[0];
    for(int i=1;i<n;i++)
    {
        //状态转移方程
        dp[i]=max(A[i],dp[i-1]+A[i]);
    }
    //寻找以A[i]结尾的最大序列和
    int k=0;
    for (int i=0;i<n;i++)
    {
        if(dp[i]>dp[k])
            k=i;
    }
    for(int i=0;i<n;i++)
        printf("%d ",dp[i]);
    printf("\n");
    printf("%d %d\n",k,dp[k]);
    return 0;
}
/*
6 -2 11 -4 13 -5 -2
 */

测试结果:
在这里插入图片描述

发布了51 篇原创文章 · 获赞 1 · 访问量 6050

猜你喜欢

转载自blog.csdn.net/qq_39827677/article/details/104527515