团体程序设计天梯赛 L3-020 至多删三个字符 (30分)(DP)

题目链接:

L3-020 至多删三个字符 (30分)

思路:

PAT顶级有一道类似的,至多删两个字符最多能得到多少不同字符串,题解就请参考这篇啦:
https://blog.csdn.net/qq_45228537/article/details/103033486
重点就是去重过程;

代码:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 1e6 + 5;
string s;
int n;
ll ans,dp[maxn][4] = {1, 1, 0 ,0};

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	cin >> s;
	n = s.length();
	for(int i = 1; i < n; i++) {
		dp[i][0] = 1;
		for(int j = 1; j <= 3; j++) {
			if(j > i + 1) break;
			if(j == i + 1) { dp[i][j] = 1; break; }
			dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
			for(int p = i - 1; p >= 0 && i - p <= j; p--)
				if(s[p] == s[i]) {
					dp[i][j] -= p ? dp[p - 1][j - i + p] : 1;
					break;
				}
		}
	}
	for(ll & x : dp[n - 1]) ans += x;
	cout << ans;
	return 0;
}
posted @ 2020-01-31 13:40  YuhanのBlog  阅读(144)  评论(0编辑  收藏  举报