FZU 2129 子串行個數

2021-07-02 04:34:54 字數 615 閱讀 4404

給乙個序列,裡面可能有相同元素,問能組成多少不同子串行。

dp。一直想用dp(i)表示到序列a1~ai的答案,一直想不出來,其實有更好的做法。我們可以用dp(i)表示最後乙個元素為ai的子串行有多少,sum(i)表示dp(1)~dp(i)的和。狀態轉移見**。

#include #include #include #include using namespace std;

const int maxn = 1e6+10;

const int mod = 1e9+7;

int n;

int a[maxn];

int lastpos[maxn]; //記錄每個數最近出現的位置

int dp[maxn]; //最後乙個元素為ai的子串行個數

int sum[maxn]; //字首和

int main()

dp[1]=1;

sum[1]=1;

lastpos[a[1]]=1;

for(int i=2;i<=n;i++)else

sum[i]=sum[i-1]+dp[i];

sum[i]%=mod;

lastpos[a[i]]=i;

} cout<

FZU2129 子串行個數 DP

題目大意 求一串行的不相同的子串行的個數。分析 注意區分子序列和子串的區別 子串行可以不連續,子串必須連續。先說說本題吧。我們用dp i 來紀錄以 前i個字元組成的序列 的不同子串行的個數,很顯然,對於dp i 1 我們把第i 1個字元str i 1 分別加到前面已經有的子串行中,這樣就又多出了dp...

FZU 2129 子串行個數 動態規劃

題意 子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1例如4,14,2,3和14,1,2,3都為4,13,14,1,2,3的子串行。對於給出序列a,請輸出不同的子串行的個數。由於答案比較大,請將答案mod 1000000...

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...