码迷,mamicode.com
首页 > 其他好文 > 详细

[luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)

时间:2017-05-26 11:53:34      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:together   include   ++   show   分享   one   i++   std   stream   

传送门

 

由于 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 }
View Code

 

[luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)

标签:together   include   ++   show   分享   one   i++   std   stream   

原文地址:http://www.cnblogs.com/zhenghaotian/p/6907535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!