zoukankan      html  css  js  c++  java
  • USACO beads

      题意是给你一串首尾相连的珠子, 珠子有b r w三种颜色, 然后让你统计某两个珠子中间到两边相同珠子的最大数量是多少??刚开始我选择了暴力求解, 后来看题解后有一种dp的方法, 感觉蛮赞的。。代码如下:

    /*
        ID: m1500293
        LANG: C++
        PROG: beads
    */
    
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int maxn = 2*400 + 10;
    
    int len;
    char str[maxn];
    int bl[maxn], br[maxn], rl[maxn], rr[maxn];
    int main()
    {
        freopen("beads.in", "r", stdin);
        freopen("beads.out", "w", stdout);
        while(scanf("%d", &len) == 1)
        {
            scanf("%s", str+1);
            for(int i=len+1; i<=2*len; i++)
                str[i] = str[i-len];
            bl[0] = rl[0] = 0;
            for(int i=1; i<=2*len; i++)
            {
                if(str[i] == 'r') rl[i]=rl[i-1]+1, bl[i]=0;
                if(str[i] == 'b') bl[i]=bl[i-1]+1, rl[i]=0;
                if(str[i] == 'w') bl[i]=bl[i-1]+1, rl[i]=rl[i-1]+1; 
            }
            br[2*len+1] = rr[2*len+1] = 0;
            for(int i=2*len; i>=1; i--)
            {
                if(str[i] == 'r') rr[i] = rr[i+1]+1, br[i]=0;
                if(str[i] == 'b') br[i] = br[i+1]+1, rr[i]=0;
                if(str[i] == 'w') br[i]=br[i+1]+1, rr[i]=rr[i+1]+1;
            } 
            int res = 0;
            for(int i=1; i<2*len; i++)
            {
                res = max(res, max(bl[i], rl[i])+max(br[i+1], rr[i+1]));
            }
            res = min(res, len);
            printf("%d
    ", res);
        }    
        return 0;    
    }
  • 相关阅读:
    StringUtils 之 hasLength()
    XML命名空间详解
    Spring bean属性 abstract、parent
    Springboot thymeleaf <thymeleaf‐layout‐dialect.version>2.2.2</thymeleaf‐layout‐dialect.version>标签导入报错
    Springboot 处理静态资源
    git命令
    nftables--linux
    debian handbook手册
    tcp和ip header
    linux内核参数-rp_filter
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5051932.html
Copyright © 2011-2022 走看看