noip2015 提高組 day2 t2
有兩個僅包含小寫英文本母的字串 a 和 b 。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到乙個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意:子串取出的位置不同也認為是不同的方案。
第一行是三個正整數 n,m,k,分別表示字串 a 的長度,字串 b 的長度,以及問題描述中所提到的 k ,每兩個整數之間用乙個空格隔開。
第二行包含乙個長度為 n 的字串,表示字串 a 。
第三行包含乙個長度為 m 的字串,表示字串 b 。
輸出共一行,包含乙個整數,表示所求方案數。由於答案可能很大,所以這裡要求輸出答案對 1,000,000,007 取模的結果。
輸入
6 3 1輸出aabaab
aab
2輸入
6 3 2輸出aabaab
aab
7輸入
6 3 3輸出aabaab
aab
7【樣例說明】
所有合法方案如下:(加下劃線的部分表示取出的子串)
樣例1:aab aab / aab aab
樣例2:a
ab aab / a aba ab / a a ba ab / aab a
abaa
b aab / aa baa b / aab aa
b樣例3:a
ab aab / a
a baa b / a ab a a b / a aba a
ba a b a a b / a a ba a
b / aab aab
【資料範圍】
對於第1組資料:1≤n≤500,1≤m≤50,k=1;
對於第2組至第3組資料:1≤n≤500,1≤m≤50,k=2;
對於第4組至第5組資料:1≤n≤500,1≤m≤50,k=m;
對於第1組至第7組資料:1≤n≤500,1≤m≤50,1≤k≤m;
對於第1組至第9組資料:1≤n≤1000,1≤m≤100,1≤k≤m;
對於所有10組資料:1≤n≤1000,1≤m≤200,1≤k≤m。
解析:令
但是這樣做空間開不下,觀察到每次轉移都是從
**:
#include using namespace std;
const int mod=1e9+7;
const int max=1010;
int n,m,k,now;
long long f[2][205][205][2];
char a[max],b[205];
int main()
swap(now,pre);
} cout<
return 0;
}
NOIP2015提高組 子串
看到方案數問題直覺就能想到dp,考慮用f i,j,k 表示a 1.i 取k個子串組成b 1.j 的方案數,發現很難轉移,因為不知道之前的方案哪些是還能拼接到結尾的,產生了前效性。考慮加一維,即 a 1.i 取k個子串組成b 1.j 且末尾子串還可以繼續拼接的方案數為 f i,j,k,0 a 1.i ...
NOIP2015提高組 子串 DP
題目描述 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出 的位置不同也認為是不同的方案。簡單dp。狀態表...
NOIP2015提高組T2 子串
有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出 的位置不同也認為是不同的方案。第一行是三個正整數 n,m...