子串行的個數

2021-06-18 23:43:29 字數 1218 閱讀 5779

龐果網題目:

子串行的定義:對於乙個序列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        012     

k=3時的子串行有:0        1        2           01        02        12        012

0(3)    1(3)  2(3)       01(3)   02(3)   12(3)   012(3)     3   

即f[k]=2*f[k-1]+1

如果考慮重複呢?

例如序列,其中ar和ak相同,ar為從ak向前第乙個與ak相同的數

則會導致重複的有,a1....ar-1,ar == a1...ar-1,ak (例如 a1 ar==a1 ak,a1 a2 ar ==a1 a2 ak)

重複的次數等於a1...ar-1的子串行數,即f[r-1],同時,ar==ak,所以重複的次數還要加一

所以去重複後應該是

f[k]=2*f[k-1]+1 - f[r-1] - 1

=2*f[k-1]-f[r-1]

至於如果在ar前面還有與ak相同的數,那麼重複部分在計算f[r]的時候已經減掉了,所以在計算f[k]時就不必再考慮了。

狀態轉移方程

f[k]=2*f[k-1]+1;  a[r]!=a[k],r=0,1,2.....k-1;

f[k]=2*f[k-1]-f[r-1]; 從k往前搜尋,存在使f[r]==f[k]的第乙個r並且r>0;

f[k]=2*f[k-1]; 從k往前搜尋,存在使f[r]==f[k]的第乙個r並且r==0;

**:

public static int run(int a)

}if(r==-1)

else //有重複,減去重複

else if(r==0)

if(f[i]<0) //取餘處理部分

f[i]+=n;

}if(f[i]>=n) //取餘處理部分

}return f[f.length-1];

}

子串行的個數

子串行的定義 對於乙個序列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的不同子串行的數量。由於答案比...

(子串行)2504 是子串行的個數

2 秒262,144 kb 20 分 3 級題 小b有乙個字串s和n個字串words 1.n 現在她想知道有多少個i滿足words i 是s的子串行。樣例解釋 a,acd,ace都是abcde的子串行,但bb不是。收起第一行輸入乙個由小寫字母組成的字串s 第二行輸入乙個數n 之後n行每行乙個字串,表...

1202 子串行個數

1202 子串行個數 子串行的定義 對於乙個序列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的不同子...