子串行的個數(解) 英雄會

2021-06-20 02:42:50 字數 1692 閱讀 4678

本題同樣來自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...