天梯賽L3 020 至多刪三個字元 (dp)

2021-09-13 14:38:48 字數 1230 閱讀 1050

題目鏈結

【題目】

l3-020 至多刪三個字元 (30 分)

給定乙個全部由小寫英文本母組成的字串,允許你至多刪掉其中 3 個字元,結果可能有多少種不同的字串?

輸入在一行中給出全部由小寫英文本母組成的、長度在區間 [4, 10​6​​] 內的字串。

在一行中輸出至多刪掉其中 3 個字元後不同字串的個數。

ababcc
25

刪掉 0 個字元得到 "ababcc"。

刪掉 1 個字元得到 "babcc", "aabcc", "abbcc", "abacc" 和 "ababc"。

刪掉 2 個字元得到 "abcc", "bbcc", "bacc", "babc", "aacc", "aabc", "abbc", "abac" 和 "abab"。

刪掉 3 個字元得到 "abc", "bcc", "acc", "bbc", "bac", "bab", "aac", "aab", "abb" 和 "aba"。

【題意】

嗯見題目吧很明確啦ww當時暴力隨便寫了一下居然就有14還是16分來著很開心哈哈哈

等弄完天梯賽一定要好好弄的dp!

【解題思路】

設dp[i][j]為前i個字元刪去j個所得到的不同字串的數量。那麼易得:

當刪去第i個字元時:dp[i][j+1]=dp[i][j+1]+dp[i-1][j]

當不刪第i個字元時:dp[i][j]=dp[i][j]+dp[i-1][j]

但是顯然如果這樣做的話加進很多重複的方案,比如樣例中的字串ababcc,當刪去倒數第二個c時剩餘字串為ababc,當刪去最後乙個字元時剩餘字串為ababc,所以如果從當前位置i向前搜尋,有乙個位置k使得s[i]=s[k],並且滿足兩個的距離小於需要刪去的字元數時,這種情況是要被減掉的。即dp[i][j]=dp[i][j]-dp[k-1][j-(i-k)]。

【**】

#includeusing namespace std;

typedef long long ll;

const int maxn=1e6+5;

ll dp[maxn][4];

char s[maxn];

int main()}}

}printf("%lld\n",dp[n][0]+dp[n][1]+dp[n][2]+dp[n][3]);

}

PTA天梯L3 020 至多刪三個字元(dp)

題意 給定乙個全部由小寫英文本母組成的字串,允許你至多刪掉其中 3 個字元,結果可能有多少種不同的字串?思路 果斷dp。設dp i j 為前i個字元刪掉j個字元的結果。從刪掉乙個字元開始想,如果當前字元和上乙個字元相等,那麼重複的情況只有1種,就是刪掉重複的字元其中乙個 如果不等,那麼考慮刪或者不刪...

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 個字元...