Polycarp and Div 3 CodeForces - 1005D
这个题目其实很简单,有很多的方法写,然后我还是不会写,感觉自己好菜,
我开始想的是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\n", dp[len]); return 0; }