hud 1003 max sum 演算法導論學習

2021-07-23 08:40:38 字數 1365 閱讀 6692

題意:找出數列中最大子數列,如果有多個則輸出第乙個

分治法:對於乙個陣列a[low..high]:最大子陣列a[i...j]必然所處的位置是一下三個情況之一:

1.完全位於子陣列a[low..mid]中,因此low<=i<=j<=mid。

2.完全位於子陣列a[mid+1...high]中,因此mid3.跨越了中點,因此low<=i<=mid對於乙個陣列a[low...high],求出跨越中點的最大子陣列,分解為兩個子陣列:a[low..mid]  a[mid+1..high] ,分別求出它們的最大子陣列,去其中大的為a[low...high]的最大子陣列;

#include#includeusing namespace std;

const int n=100000;

int a[n];

struct array;

array();

};array crossp(int *a,int low,int mid,int high)

}sum=0;

for(int i=mid+1;i<=high;i++)

}return array(lmaxpos,rmaxpos,lmax+rmax);

}array find_max(int *a,int low,int high)

}int main()

{ int t,num;

cin>>t;

for(int i=0;i>num;

for(int i=0;i>a[i];

array c;

c = find_max(a,0,num-1);

cout<<"case "<

做法二:動態規劃

#include#include#include#include#include#include#include#include#include#include#define ll long long

using namespace std;

const int inf = ( 2e9 ) + 2;

const ll maxn = 100010;

int a[maxn];

int main()

{ int t;

scanf("%d",&t);

for(int cas=1;cas<=t;cas++)

{ int n;

scanf("%d",&n);

for(int i=1;i<=n;i++)

scanf("%d",&a[i]);

int sum=0,ans=0;

int l=1,r=1,x=1;

ans=sum=a[1];

for(int i=2;i<=n;i++)

{ if(sum+a[i]

動態規劃 HDU 1003 Max Sum

思路的話,並沒有什麼特別的,這道題使用dp的做法就可以了。include include include includeusing namespace std int dp 100005 int l 100005 記錄第i個字段的起始點 const int inf 0x3f3f3f3f int ma...

HDU 1003 Max Sum 動態規劃)

題意 給定乙個陣列,求最大和子串行的值以及子串行的起始點和結束點。思路 dp嘛 當sum值大於最大值時,就記下最大值以及這個值對應的左起和右終的下標。當sum 0時,證明加上當前數整個數值為負,這個負數一定不會是下乙個最大子串行的成員,所以起始點要從當前位置的下一位開始,sum也要從新開始,因為下乙...

HDU 1003 Max Sum 動態規劃

這次看了這題的動態規劃寫法,頓時覺得好理解多了。這裡要對dp i 的意義進行一下說明,dp i 表示從1 i包含第i個數的最大子串和,如果前i 1個數的包含i 1在內的最大和為正數的話,那麼包含第i個數的最大子串和就是dp i 1 seq i 否則dp i 就等於seq i 了。該題的動態遞迴寫法並...