題意:求子序列種數
思路:dp[i]代表到i的所有種數,把當前i放到末尾,那麼轉移方程dp[i] = dp[i - 1] + dp[i -1],但是可能存在重複,比如1 2 3 2,在第2位置的時候出現12,但是在第4位置的時候,還是可能出現12,那麼我們要減掉多出來的,就是減去dp[1]這裡加2的部分。也就是減去相同數字的前乙個的種數。
**:
#include#include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;typedef unsigned
long
long
ull;
const
int maxn = 1e6 + 5
;const
int m = 50 + 5
;const ull seed = 131
;const
int inf = 0x3f3f3f3f
;const ll mod = 1000000007
;ll dp[maxn];
inta[maxn], pre[maxn];
intmain()
dp[0] = 1
; memset(pre,
0, sizeof
(pre));
for(int i = 1; i <= n; i++)
pre[a[i]] =i;
}printf(
"%lld\n
", dp[n] - 1
); }
return0;
}
FZU2129 子串行個數 DP
題目大意 求一串行的不相同的子串行的個數。分析 注意區分子序列和子串的區別 子串行可以不連續,子串必須連續。先說說本題吧。我們用dp i 來紀錄以 前i個字元組成的序列 的不同子串行的個數,很顯然,對於dp i 1 我們把第i 1個字元str i 1 分別加到前面已經有的子串行中,這樣就又多出了dp...
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...