龐果網題目:
子串行的定義:對於乙個序列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的不同子...