zoukankan      html  css  js  c++  java
  • poj3670

    O(n)的dp

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    
    #define maxn 30005
    
    int n;
    int cow[maxn];
    int f[maxn][5];
    
    void input()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &cow[i]);
    }
    
    void work()
    {
        memset(f, 0, sizeof(f));
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= 3; j++)
            {
                f[i][j] = f[i - 1][1];
                for (int k = 2; k <= j; k++)
                    f[i][j] = min(f[i][j], f[i - 1][k]);
                if (cow[i] != j)
                    f[i][j]++;
    //            printf("%d %d %d\n", i, j, f[i][j]);
            }
        }
        int ans = n;
        for (int i = 1; i <= 3; i++)
            ans = min(ans, f[n][i]);
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= 3; j++)
            {
                f[i][j] = f[i - 1][3];
                for (int k = 2; k >= j; k--)
                    f[i][j] = min(f[i][j], f[i - 1][k]);
                if (cow[i] != j)
                    f[i][j]++;
            }
        }
        for (int i = 1; i <= 3; i++)
            ans = min(ans, f[n][i]);
        printf("%d\n", ans);
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);
        input();
        work();
        return 0;
    }
  • 相关阅读:
    次小生成树(SST)
    传纸条(scrip)
    动态规划练习5
    动态规划练习4
    整数的lqp拆分
    [HNOI2002]跳蚤
    BZOJ1803: Spoj1487 Query on a tree III
    51nod-1526: 分配笔名
    51nod-1615: 跳跃的杰克
    BZOJ2588: Spoj 10628. Count on a tree
  • 原文地址:https://www.cnblogs.com/rainydays/p/2574864.html
Copyright © 2011-2022 走看看