題意:找出數列中最大子數列,如果有多個則輸出第乙個
分治法:對於乙個陣列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 了。該題的動態遞迴寫法並...