最大子段和與最長遞增子序列(貪心與動態規劃)
阿新 • • 發佈:2018-12-03
話不多說先上程式碼。。。。。
最大子段和
題目描述
給出一段序列,選出其中連續且非空的一段使得這段和最大。
輸入輸出格式
輸入格式:
第一行是一個正整數NNN,表示了序列的長度。
第二行包含NNN個絕對值不大於100001000010000的整數AiA_iAi,描述了這段序列。
輸出格式:
一個整數,為最大的子段和是多少。子段的最小長度為111。
輸入樣例#1:7
2 -4 3 -1 2 -4 3
輸出樣例#1:4
說明
【樣例說明】
2,−4,3,−1,2,−4,32,-4,3,-1,2,-4,32,−4,3,−1,2,−4,3中,最大的子段和為4,該子段為3,−1,23,-1,23,−1,2.
【資料規模與約定】
對於40%40\%40%的資料,有N≤2000N ≤ 2000N≤2000。
對於100%100\%100%的資料,有N≤200000N ≤ 200000N≤200000。
#include<cstdio> int n,j,sum,maxx; int main(){ scanf("%d%d",&n,&maxx); sum=maxx;//輸入n while(--n){ scanf("%d",&j); sum=sum>0?sum:0; sum+=j; maxx=maxx>sum?maxx:sum; }//貪心,如果負了就捨去 return (printf("%d",maxx))&0;//輸出並return 0 }
最長遞增子序列
#include<stdio.h> //最長增長子序列 #define max(x,y) x>y? x:y int main() { int i,j,n; scanf("%d",&n); int a[10005]; int b[10005]; for(i=0;i<n;i++) { scanf("%d",&a[i]); b[i]=1; } for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(a[i]<a[j]) { b[i]=max(b[j]+1,b[i]); } } } int max=-1; for(i=0;i<n;i++) { if(max<b[i]) { max=b[i]; } } printf("%d",max); }