• [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
  • 相关阅读:
    Android天线信号刷新流程
    source insight配置
    android light sensor port
    wifi workflow
    vi/vim常用配置及使用命令
    contacts里QuickContactBadge弹出窗口
    ubuntu12.04与windows系统共享
    shell脚本编程
    凤凰照片的大小修改
    wf2
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6907535.html
Copyright © 2020-2023  润新知