問題描述:
給定乙個全部由小寫英文本母組成的字串,允許你至多刪掉其中 3 個字元,結果可能有多少種不同的字串?
輸入格式:
輸入在一行中給出全部由小寫英文本母組成的、長度在區間 [4, 1e6] 內的字串。
輸出格式:
在一行中輸出至多刪掉其中 3 個字元後不同字串的個數。
解法:
d[i]
[j]表示前i個字元,刪掉j個字元的方案數,
轉移方程:d[i]
[j]=d[i-1]
[j]+d[i-1]
[j-1],
(對應刪和不刪)
但是這樣會重複計算,例如
caba,刪除ab和刪除ba得到的串是一樣的,
記pre[s[i]
]為s[i]上一次出現的位置,
設x=pre[s[i]
]那麼d[i]
[j]-
=d[x-1]
[j-(i-x)],
為什麼這樣減?
因為重複匹配的部分是d[x-1]
[j-(i-x)
],需要減掉一次.
code:#include
using
namespace std;
#define int long long
const
int maxm=
1e6+5;
char s[maxm]
;int d[maxm][4
];int pre[26]
;int n;
signed
main()
} pre[s[i]
-'a'
]=i;
}int ans=0;
for(
int i=
0;i<=
3;i++
) cout
}
L3 020 至多刪三個字元 (30 分)
l3 020 至多刪三個字元 30 分 給定乙個全部由小寫英文本母組成的字串,允許你至多刪掉其中 3 個字元,結果可能有多少種不同的字串?輸入在一行中給出全部由小寫英文本母組成的 長度在區間 4,10 6 內的字串。在一行中輸出至多刪掉其中 3 個字元後不同字串的個數。ababcc25 刪掉 0 個...
L3 020 至多刪三個字元 (30 分 dp
給定乙個全部由小寫英文本母組成的字串,允許你至多刪掉其中 3 個字元,結果可能有多少種不同的字串?輸入在一行中給出全部由小寫英文本母組成的 長度在區間 4,10 6 內的字串。在一行中輸出至多刪掉其中 3 個字元後不同字串的個數。ababcc25 刪掉 0 個字元得到 ababcc 刪掉 1 個字元...
PTA天梯L3 020 至多刪三個字元(dp)
題意 給定乙個全部由小寫英文本母組成的字串,允許你至多刪掉其中 3 個字元,結果可能有多少種不同的字串?思路 果斷dp。設dp i j 為前i個字元刪掉j個字元的結果。從刪掉乙個字元開始想,如果當前字元和上乙個字元相等,那麼重複的情況只有1種,就是刪掉重複的字元其中乙個 如果不等,那麼考慮刪或者不刪...