FZU2129 子串行個數 DP

2021-07-04 16:16:57 字數 604 閱讀 5594

題目大意:求一串行的不相同的子串行的個數。

分析:注意區分子序列和子串的區別:子串行可以不連續,子串必須連續。先說說本題吧。我們用dp[ i ]來紀錄以 前i個字元組成的序列 的不同子串行的個數,很顯然,對於dp[ i+1 ],我們把第i+1個字元str[ i+1 ]分別加到前面已經有的子串行中,這樣就又多出了dp[ i ]個新的子串行,再加上str[ i+1 ]本身,即有:dp[ i+1 ]=dp[ i ]×2+1。但是這需要str[ i ]在前面沒有出現過,如果出現過,那麼必然有一部分重複的序列,重複的個數為dp[ str[i+1]第一次出現的位置-1 ]+1(加的1表示str[i+1]第一次出現時把它算成的乙個子串行)。

實現**如下:

#include#include#define mod 1000000007

#define maxn 1000005

typedef long long ll;

ll f[maxn];

int last[maxn],a,n;

int main()

printf("%i64d\n",f[n]%mod);

} return 0;

}

FZU 2129 子串行個數

給乙個序列,裡面可能有相同元素,問能組成多少不同子串行。dp。一直想用dp i 表示到序列a1 ai的答案,一直想不出來,其實有更好的做法。我們可以用dp i 表示最後乙個元素為ai的子串行有多少,sum i 表示dp 1 dp i 的和。狀態轉移見 include include include ...

fzu2129 子串行個數 計數dp

給n n 1e6 個數,統計所有不同子串行的個數 第i個數個數ai 0 ai 1e6 答案mod 1e9 7 last v 表示v上一次出現的位置 dp i 表示到i為止,所有本質不同子串行的個數 考慮a i 如果a i 沒有出現過,那麼dp i 至少為dp i 1 在dp i 1 每個子串行後補a...

FZU 2129 子串行個數(DP)題解

題意 求子序列種數 思路 dp i 代表到i的所有種數,把當前i放到末尾,那麼轉移方程dp i dp i 1 dp i 1 但是可能存在重複,比如1 2 3 2,在第2位置的時候出現12,但是在第4位置的時候,還是可能出現12,那麼我們要減掉多出來的,就是減去dp 1 這裡加2的部分。也就是減去相同...