本題同樣來自caopengcs,只要你有興趣,每個人都可以出題(出題入口在主頁右側邊欄「貢獻題目」->「我要發布」內),以下是題目詳情:
子串行的定義:對於乙個序列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,有些子串行可能是相同的,這裡只算做1個,要求輸出a的不同子串行的數量。
輸入: 長度為n的陣列1<=n<=100,陣列元素0<=a[i]<=110
輸出:子串行 的個數對1000000007取餘數的結果(由於答案比較大,輸出mod 1000000007的結果即可)。
首先感謝cp大神,在這一題上有著巨大的幫助,因為之前理解題意的原因,一直認為測試點有問題,後來茅塞頓開,終於理解了題意;
題目中的例項有一定的特殊性,假如給的序列為{1, 1, 4, 1};
則其子序列有「1」,「4」,「1, 1」,「1, 4」,"4, 1","1, 1, 4",「1, 1, 1」,「1, 4, 1」,以及"1, 1, 4, 1"共九種;
如果這個序列沒有重複資料的話,很明顯這就是乙個集合的問題了;
不過當出現重複的話,此時的解法就不一樣了:
如果未發生重複現象,則子串行的個數隨著個數的增加,其個數sum[i] = sum[i - 1] + dp[i];此時dp[i] = sum[i - 1];
若之前發生的重複現象,即exist[x] != 0;此時的dp[i]就會發生與之前出現x值重複的組合,此時dp[i] = sum[i - 1];
dp[i] -= sum[exist[x] - 1];
繼續深究,貼個**:
#include #include #include #include const int m = 1000000007;
using namespace std;
int run(const int *a, int n) ; //判斷是否存在,陣列元素0<=a[i]<=110
int dp[101] = ;
int sum[101] = ; //個數
int x;
for (int i = 1; i <= n; ++i)
exist[x] = i; //記錄最近出現x的下標
sum[i] = sum[i - 1] + dp[i]; //更新子串行個數
if (sum[i] >= m) //超限則進行-m,重新在表示範圍內
多多交流...o(∩_∩)o
挑戰龐果英雄會之子串行的個數
題目詳情 本題同樣來自caopengcs,只要你有興趣,每個人都可以出題 出題入口在主頁右側邊欄 貢獻題目 我要發布 內 以下是題目詳情 子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1例如 4,14,2,3和14,1,...
Csdn英雄會之平方子串行的個數
文章 題目 如果乙個非空的字串是兩個相同的字串連線而成,則稱它為平方的。例如aa是平方的,因為它是兩個a連線起來的。abab是平方的因為它是兩個ab連線起來的。而aaa和abba就不是平方的字串。給定乙個字串,你可以從中刪去任意多個字元 可以不刪 得到的是子串行,問最終結果有多少個不同的平方的字串。...
子串行的個數
龐果網題目 子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行,其中1 p1 還是靠動態規劃 設f k 為前k個數的子串行數目,則f 0 1 f k 與f k 1 有什麼關係呢?例如序列,k 2時的子串行有 0 1 2 01 02 12...