zoukankan      html  css  js  c++  java
  • SCU3037 Painting the Balls

    Description

    Petya puts the (N) white balls in a line and now he wants to paint some of them in black, so that at least two black balls could be found among any (M) successive balls.
    Petya knows that he needs (C_i) milliliters of dye exactly to paint the (i)-th ball.
    Your task is to find out for Petya the minimum amount of dye he will need to paint the balls.

    Input

    The first line contains two integer numbers (N and M (2<=N<=10000, 2<=M<=100, M<=N)).
    The second line contains (N) integer numbers (C_1, C_2, ..., C_N (1 le C_i le10000)).

    Output

    Output only one integer number - the minimum amount of dye Petya will need (in milliliters).

    Sample Input

    6 3
    1 5 6 2 1 3

    Sample Output

    9

    (f[i][j])表示最后一个黑球在(i)倒数第二个黑球在(i-j)的最小值。
    转移方程$$f[i][j] = min(f[j][1 sim m-j])+C_i$$
    前缀优化,另(g[i][j] = min(f[i][1 sim j]))。复杂度(O(NM))

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    
    const int maxn = 10010,maxm = 110,inf = 1<<30;
    int N,M,C[maxn],f[maxn][maxm],g[maxn][maxm],ans = inf;
    
    inline int gi()
    {
        char ch; int ret = 0,f = 1;
        do ch = getchar(); while (!(ch >= '0'&&ch <= '9')&&ch != '-');
        if (ch == '-') f = -1,ch = getchar();
        do ret = ret*10+ch-'0',ch = getchar(); while (ch >= '0'&&ch <= '9');
        return ret*f;
    }
    
    int main()
    {
    	freopen("3037.in","r",stdin);
    	freopen("3037.out","w",stdout);
        N = gi(); M = gi();
        for (int i = 1;i <= N;++i) C[i] = gi();
        for (int i = 0;i <= N;++i) for (int j = 0;j <= M;++j) g[i][j] = f[i][j] = inf;
        for (int i = 1;i <= M;++i) for (int j = 1;j < i;++j) f[i][j] = C[i]+C[i-j],g[i][j] = min(g[i][j-1],f[i][j]);
        for (int i = M+1;i <= N;++i) for (int j = 1;j < M;++j) f[i][j] = g[i-j][M-j]+C[i],g[i][j] = min(g[i][j-1],f[i][j]);
        for (int i = 1;i <= M;++i) for (int j = 1;j < i;++j) ans = min(ans,f[N-M+i][j]);
        cout << ans << endl;
        fclose(stdin); fclose(stdout);
        return 0;
    }
    
  • 相关阅读:
    8.6 First_value和Last_value
    iOS_第3方类库_側滑选项卡SlideSwitchView
    公开的函数把函数作为參数
    .NET 框架简单介绍
    HDU-3577-Fast Arrangement-区间更新
    拥抱PBO(基于项目的组织)聚焦核心价值创造
    一个使用sbt编译的JNI C++ 的模板
    BestCoder Round #1
    饭统网倒闭:不创新、不放权就是作死 .
    【SSH 基础】浅谈Hibernate关系映射(3)
  • 原文地址:https://www.cnblogs.com/mmlz/p/6403852.html
Copyright © 2011-2022 走看看