zoukankan      html  css  js  c++  java
  • E:K-periodic Garland(DP)

    K-periodic Garland

    思路

    每个点我们有两种决策,其值为0或1:

    如果点我们放置0的话,我们有其前一位数字是零,或者其前一位数字是一。

    如果这个点我们放置1的话,我们有其前面是按照每k个数字都出现一次1的排列,也有可能其前面的数字全是0。

    这就有点像是(dp)了,我们规定(dp[i][0]),表示我们在这一位放(0)(dp[i][1]),表示我们在这一位放(1),由此我们有状态转移方程。

    dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + (str[i] == '1')
    if(i >= k)
        dp[i][1] = min(dp[i - k][1] + sum[i - 1] - sum[i - k], sum[i - 1]) + (str[i] == '0')
    else
        dp[i][1] = min(dp[0][1] + sum[i - 1] - sum[0], sum[i - 1]) + (str[i] == '0')
    

    代码

    #include <bits/stdc++.h>
    #define mp make_pair
    #define pb push_back
    
    using namespace std;
    
    typedef pair<int, int> pii;
    typedef long long ll;
    typedef unsigned long long ull;
    
    const double eps = 1e-7;
    const double pi = acos(-1.0);
    const int inf = 0x3f3f3f3f;
    
    inline ll read() {
        ll f = 1, x = 0;
        char c = getchar();
        while(c < '0' || c > '9') {
            if(c == '-') f = -1;
            c = getchar();
        } 
        while(c >= '0' && c <= '9') {
            x = (x << 1) + (x << 3) + (c ^ 48);
            c = getchar();
        }
        return f * x;
    }
    
    const int N = 1e6 + 10;
    
    int sum[N], dp[N][2], n, k;
    char str[N];
    
    int main() {
        // freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
        // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
        int _ = read();
        while(_--) {
            n = read(), k = read();
            scanf("%s", str + 1);
            sum[0] = dp[0][0] = dp[0][1] = 0;
            for(int i = 1; i <= n; i++)
                sum[i] = sum[i - 1] + (str[i] - '0');
            for(int i = 1; i <= n; i++) {
                dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + (str[i] == '1');
                if(i >= k)
                    dp[i][1] = min(sum[i - 1], dp[i - k][1] + sum[i - 1] - sum[i - k]) + (str[i] == '0');
                else dp[i][1] = min(sum[i - 1], dp[0][1] + sum[i - 1] - sum[0]) + (str[i] == '0');
            }
            printf("%d
    ", min(dp[n][0], dp[n][1]));
        }
        return 0;
    }
    
    
  • 相关阅读:
    WebQQ2.0 PHP
    HTML文档类型 PHP
    字符●圆角 PHP
    IIS日志分析器 PHP
    JS 像素数字 PHP
    3DTagCloud3D标签云 PHP
    QQ截屏工具提取 PHP
    .NET嵌入DLL ILMerge工具应用 PHP
    JS CSS 压缩工具(GUI界面) PHP
    Javascript 函数初探
  • 原文地址:https://www.cnblogs.com/lifehappy/p/13163634.html
Copyright © 2011-2022 走看看