題意:子串行的定義:對於乙個序列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 1000000007)
思路:設前i個數字的子串行數為f(i)。
1.如果第i個數字在前i個數字裡都沒有出現過,那麼,原來i-1個數字裡面的子串行也是前i個數字的子串行,總共是f(i-1),而在原來i-1個數字的子串行每個的背後加乙個a[i]也是新的子串行,總共是f(i-1)個,然後最後乙個數字單獨也可以組成乙個新的子串行,是1個,因此這時f(i)=f(i)+f(i)+1。
2.如果第i歌數字在前面i個數字裡面出現過,那麼f(i)=f(i)+f(i)-f(a[i]最後一次出現的位置-1)。因為這時候,單獨乙個a[i]的情況已經被計算過,於是沒有了+1,而往a[i]最後一次出現的位置-1加上乙個a[i]的情況也已經被計算過,一次要減掉。
注意:遇到減號的時候取模時要加mod再取模。
#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
題目大意 求一串行的不相同的子串行的個數。分析 注意區分子序列和子串的區別 子串行可以不連續,子串必須連續。先說說本題吧。我們用dp i 來紀錄以 前i個字元組成的序列 的不同子串行的個數,很顯然,對於dp i 1 我們把第i 1個字元str i 1 分別加到前面已經有的子串行中,這樣就又多出了dp...
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...