zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    CSS learnning...
    软件工程课程建议
    结对编程(三)
    结对编程(二)
    关于结对编程的感想
    关于“Durian”调查问卷的心得体会
    我的软件工程课目标
    软件工程课程建议
    进阶版《结对编程》
    结对编程实现四则运算
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/11323753.html
Copyright © 2011-2022 走看看