PAT 甲級 1007. Maximum Subsequence Sum (DP 動態規劃)

部分正確

#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
#include "queue"
using namespace std;
int main()
{
 
    int k,c=0;
    cin>>k;
    int a[100000]={0};
    int n=0;
    while(k--)
    {
        cin>>a[n];
        if(a[n++]<0)
            c++;
    }

    int i,maxx=0,sum=0,f1,f2,e;
    f1=f2 =e=a[0];
    int ff[1000]={0 };
    int t=0;
    for(i=0;i<n;i++)
    {
            sum+=a[i];
    if(sum<0)
    {
        sum=a[i];
        f1=a[i];


    }

    if(maxx<sum)
    {
        e=a[i];
        f2=f1;
    }
        maxx=max(maxx,sum);
    }
    if(c==n )
        cout<<0<<" "<<a[0]<<" "<<a[n-1];
   else cout<<maxx<<" "<<f2<<" "<<e<<endl;

 return  0;


}

沒有用dp,嘗試了很多測試數據,都發現不到問題在哪兒,後面該用dp動態規劃,ac了,需要注意的就是如果全是負數的話,輸出0 數組的首位 和 末尾,不然 4 過不去

#include <iostream>
#include "cstring"
#include <stdio.h>
#include "iomanip"
#include "vector"
#include "cmath"
#include "stack"
#include "algorithm"
#include <math.h>
#include "map"
#include "queue"
using namespace std;
int main()
{
     
    int n;
    cin>>n;
    int negative=0;
    int a[10001]={0},dp[10001]={0},pos[10001]={0},e=0;//dp表示到第i的元素的最大和,pos表示第i的元素最大和的首位元素下標
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        dp[i]=a[i];
        if(a[i]<0)
            negative++;
    }
    int maxx=dp[0];
    for(int i=1;i<n;i++)
    {
        if(dp[i]<dp[i-1]+a[i])//如果a[i]的值<前一位的最大和加上本身
        {
            dp[i]=dp[i-1]+a[i];//跟新當前的最大和
            pos[i]=pos[i-1];//pos[i]指向第一位元素的小標
        }
        else{

            pos[i]=i;//如果加上前一位最大和大於,也就是上一位位負數,這時候肯定不加上上一位,那就從當前位開始計數,下表爲自己本身
        }
        if(maxx<dp[i])
        {
            maxx=dp[i];
            e=i;
        }

    }
    if(negative==n)
        printf("0 %d %d",a[0],a[n-1]);
    else
    printf("%d %d %d",maxx,a[pos[e]],a[e]);

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章