3 19 動態規劃專題 上 (參考《演算法筆記》)

2021-10-04 03:16:10 字數 1480 閱讀 9338

給定乙個數字序列: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...