zoukankan      html  css  js  c++  java
  • [luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)

    传送门

    由于 Di 只有 3 种情况,那么就很简单了

    f[i][j][0] 表示前 i 个,且第 i 个变成 j 的 递增序列最小修改次数

    f[i][j][1] 表示前 i 个,且第 i 个变成 j 的 递减序列最小修改次数

    状态转移看代码。

    ——代码

     1 #include <cstdio>
     2 #include <iostream>
     3 
     4 const int MAXN = 30001;
     5 int n, ans = ~(1 << 31);
     6 int a[MAXN], f[MAXN][4][2];
     7 
     8 inline long long read()
     9 {
    10     long long x = 0, f = 1;
    11     char ch = getchar();
    12     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
    13     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
    14     return x * f;
    15 }
    16 
    17 inline int min(int x, int y)
    18 {
    19     return x < y ? x : y;
    20 }
    21 
    22 int main()
    23 {
    24     int i, j;
    25     n = read();
    26     for(i = 1; i <= n; i++) a[i] = read();
    27     for(i = 1; i <= n; i++)
    28     {
    29         f[i][1][0] = f[i - 1][1][0] + (a[i] != 1);
    30         f[i][2][0] = min(f[i - 1][1][0], f[i - 1][2][0]) + (a[i] != 2);
    31         f[i][3][0] = min(f[i - 1][1][0], min(f[i - 1][2][0], f[i - 1][3][0])) + (a[i] != 3);
    32         
    33         f[i][1][1] = min(f[i - 1][1][1], min(f[i - 1][2][1], f[i - 1][3][1])) + (a[i] != 1);
    34         f[i][2][1] = min(f[i - 1][3][1], f[i - 1][2][1]) + (a[i] != 2);
    35         f[i][3][1] = f[i - 1][3][1] + (a[i] != 3);
    36     }
    37     for(i = 1; i <= 3; i++)
    38         for(j = 0; j <= 1; j++)
    39             ans = min(ans, f[n][i][j]);
    40     printf("%d
    ", ans);
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    Visual Studio 2010 C++ 属性设置基础
    Visual Studio 2010 C++ 工程文件解读
    编译Python2.7.10
    编译libmemcached
    python2.7.10 VS2015编译方法
    zlib编译方法
    Openssl VS编译方法
    STL容器
    C++数值类型与string的相互转换
    NGINX配置文件详解
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6907535.html
Copyright © 2011-2022 走看看