給定乙個數字序列:a1,a2······an,求i,j(1<=i<=j<=n)使得ai+······+aj最大,輸出這個最大和。
sample input
-2 11 -4 13 -5 -2
sample output
用dp[i]表示從a1到ai最大連續子串行和,必須是以ai為結尾的,也就是必須加上ai。
因為是要連續的序列,所以只有兩種可能,第一種就是他本身,第二種就是dp[i-1]+ai。所以dp[i]就是前面兩種的最大值。
#include#include#define maxn 100000
using namespace std;
int dp[maxn],i,n,num[maxn];
int main()
return 0;
}
在乙個數字序列中,找到乙個最長的子串行(可以不連續)使得這個子串行是不下降(非遞減)的。
sample input
1 2 3 -1 -2 7 9
sample output
dp[i]表示到以第i個數為結尾的最大子串行的個數。
而dp[i]的計算需要乙個迴圈,從1到i-1的乙個迴圈
迴圈為i-1時,如果num[i]>=num[i-1]的話,dp[i]=dp[i-1]+1,如果num[i]如此進行1到i-1迴圈,其中最大值就是dp[i]的值。
#include#includeusing namespace std;
#define max 100000
int dp[max],num[max],i,j,n;
int main()
res=max(dp[i],res);
}printf("%d\n",res);
}return 0;
}
給定兩個字串(或數字序列)a和b,求乙個字串,使得這個字串是a和b最長的公共部分(子串行可以不連續)。
比如 sadstory 跟 adminsorry 最長公共子串行就是 「adsory」
用dp[i][j]表示第乙個字串的第i個字元為止與第二個字串第j個字元為止最長公共子串行的個數。
如果a[i]==b[j],那麼dp[i][j]=dp[i-1][j-1]+1,如果不相等的話,就等於max(dp[i-1][j],dp[i][j-1]).
#include#include#includeusing namespace std;
#define max 10000
char a[max],b[max];
int dp[max][max],i,j;
int main()
}printf("%d\n",dp[l1][l2]);
}return 0;
}
動態規劃專題
多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規劃 個人的理解 就是處於當前決策時要依賴前面的已知情況,將看似 連續無統一標準解決方案 的問題分割成多個 可以商量的 的決策過程。商量就是依靠已知的情況覺得未知 那麼什麼問題才可以用到動態規劃...
動態規劃專題
這個題,初學之時,老師教我們用分治演算法,分三路 在左邊子陣列 在右邊子陣列以及跨越中線,其實用動態規劃已經很簡單了,看狀態轉移方程就明白了 dp i beginarr i quad i 0 max quad otherwise end def maximum subarr arr if not a...
動態規劃專題
例一 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?1 include 2 include 3 include 4 include5 using namespace std 6int solution int n 遞迴做法713 int dp 11 14in...