Polycarp and Div 3 CodeForces

这个题目其实很简单,有很多的方法写,然后我还是不会写,感觉自己好菜,

我开始想的是dp,但是不知道怎么dp,看了网上题解,豁然开朗

dp[i] 表示前面i个数满足条件的数有多少,f[s]表示前缀和为s的最大的满足条件的数

if(a[i]==0) dp[i]=dp[i-1]+1;

else dp[i]=max(dp[i-1],f[s]+1)

知道这些就很简单了。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
ll dp[maxn], f[3];
char s[maxn];
int a[maxn];

int main() {
	scanf("%s", s + 1);
	int len = strlen(s + 1);
	for (int i = 1; i <= len; i++) a[i] = (s[i] - '0') % 3;
	dp[0] = 0;
	int sum = 0;
	f[0] = 0;
	f[1] = f[2] = -inf;
	for (int i = 1; i <= len; i++) {
		sum = (sum + a[i]) % 3;
		if (a[i] == 0) dp[i] = dp[i - 1] + 1;
		else dp[i] = max(dp[i - 1], f[sum] + 1);
		f[sum] = max(f[sum], dp[i]);
	}
	printf("%lld
", dp[len]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/EchoZQN/p/11323753.html