[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\n", ans);
41     return 0;
42 }

时间: 2024-10-05 01:51:21

[luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)的相关文章

洛谷P2896 [USACO08FEB]一起吃饭Eating Together

P2896 [USACO08FEB]一起吃饭Eating Together 题目描述 The cows are so very silly about their dinner partners. They have organized themselves into three groups (conveniently numbered 1, 2, and 3) that insist upon dining together. The trouble starts when they lin

洛谷 P2896 [USACO08FEB]一起吃饭Eating Together

P2896 [USACO08FEB]一起吃饭Eating Together 题目描述 The cows are so very silly about their dinner partners. They have organized themselves into three groups (conveniently numbered 1, 2, and 3) that insist upon dining together. The trouble starts when they lin

洛谷—— P2896 [USACO08FEB]一起吃饭Eating Together

https://www.luogu.org/problem/show?pid=2896 题目描述 The cows are so very silly about their dinner partners. They have organized themselves into three groups (conveniently numbered 1, 2, and 3) that insist upon dining together. The trouble starts when th

POJ 3670 Eating Together (DP,LIS)

题意:给定 n 个数,让你修改最少的数,使得它变成一个不下降或者不上升序列. 析:这个就是一个LIS,但是当时并没有看出来...只要求出最长LIS的长度,用总数减去就是答案. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <s

Fish eating fruit 沈阳网络赛(树形dp)

Fish eating fruit \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 大体的题意就是给出一棵树,求每一对点之间的距离,然后把该距离存在距离 \(\mod 3\) 的位置,输出总和. 思路 令两个 \(dp\) 数组和两个辅助 \(dp\) 的数组. \(dp1[i][j]\) 表示从 \(i\) 为起点往下到各个点距离 \(\mod 3\) 后为 \(j\) 的距离总和. \(cnt1[i][j]\) 表示以 \

POJ 3670 Eating Together (①O(n)的dp,②最长字段和)

题目大意:找到队列中不符合非升(降)序趋势的编号个数, 分别判断升序跟降序的个数,最后取最小. 两种方法: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; #define maxn 30005 int n; int cow[maxn]; int f[maxn][5]; int main() { scanf(&quo

2019 沈阳网络赛 D Fish eating fruit ( 树形DP)

题目传送门 题意:求一颗树中所有点对(a,b)的路径长度,路径长度按照模3之后的值进行分类,最后分别求每一类的和 分析:树形DP \(dp[i][j]\) 表示以 i 为根的子树中,所有子节点到 i 的路径长度模3等于 j 的路径之和 \(c[i][j]\) 表示以 i 为根的子树中,所有子节点到 i 的路径长度模3等于 j 的点数 \(ok[i][j]\) 表示以 i 为根的子树中,是否有子节点到 i 的路径长度模3等于 j 每次只考虑所有经过根 x 的路径,并且路径的一个端点在 x 的一颗子

[BZOJ1609] [Usaco2008 Feb] Eating Together麻烦的聚餐 (dp)

Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2批就餐的奶牛了.由于奶牛们不理解FJ的安排,晚饭前的排队成了一个大麻烦. 第i头奶牛有一张标明她用餐批次D_i(1 <= D_i <= 3)的卡片.虽然所有N(1 <= N <= 30,000)头奶牛排成了很整齐的队伍但谁都看得出来,卡片上的号码是完全杂乱无章的. 在若干次

dp状态压缩

dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状态怎么压缩?压缩后怎么表示?怎么转移?是否具有最优子结构?是否满足后效性?涉及到一些位运算的操作,虽然比较抽象,但本质还是动态规划.找准动态规划几个方面的问题,深刻理解动态规划的原理,开动脑筋思考问题.这才是掌握动态规划的关键. 动态规划最关键的要处理的问题就是位运算的操作,容易出错,状态的设计也直