兩個串,s t,求s的所有子串中大於 t 的數目
dp[i][j] 表示 s的前i個,匹配 t 的前 j 個的種類數,
那麼 if(s[i] == t[j])
dp[i][j] = dp[i -1][j] + dp[i - 1][j - 1];
else
dp[i][j] = dp[i - 1][j];
對於長度大於 t 的沒有前導0的都符合,那麼就看長度等於t的就可以了,
當匹配到 i, j 的時候,if(s[i] > t[j]) 那麼該貢獻為:
前面匹配j-1的種類數*後面隨便選len2-j個,即當前的貢獻就為dp[i - 1][j - 1] * c[len1 - i][len2 - j]。
1 #include2view codeusing
namespace
std;
3 typedef long
long
ll;4
const
int n = 3005;5
const ll mod = 998244353;6
char
s[n],t[n];
7ll c[n][n];
8ll dp[n][n];
9int
main()
1020}21
22int
t,n,m;
23for( scanf("
%d",&t) ; t ; t--)
30//
計算長度相同時,某一位置比t的位置大,對答案的貢獻
31 ll ans = 0;32
for(int i=1;i<=n;i++)
38else
if( s[i] >t[j] )41}
42}43//
計算長度大於t串長度時,對答案的貢獻
44for(int i=1;i<=n;i++)49}
50 printf("
%lld\n
",ans);51}
52return0;
53 }
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...