博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2896 [USACO08FEB]一起吃饭Eating Together
阅读量:4686 次
发布时间:2019-06-09

本文共 1588 字,大约阅读时间需要 5 分钟。

可以考虑DP

设 f [ i ] [ 1/2/3 ] [ 0/1 ] 表示当前考虑到第 i 头牛,打算让当前位置的编号变成 1/2/3,并且打算让整段序列上升/下降 0/1

然后就对每种情况慢慢考虑转移就行了

可以发现第一维可以直接优化掉,然后空间就是 O(1),时间就是 O(n)

太简单就不用注释了吧...

#include
#include
#include
#include
#include
using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}int n,f[4][2];int main(){ int a; n=read(); while(n--) { a=read(); if(a==1) { f[3][0]=min(f[3][0],min(f[2][0],f[1][0]))+1; f[2][0]=min(f[2][0],f[1][0])+1; f[1][1]=min(f[3][1],min(f[2][1],f[1][1])); f[2][1]=min(f[3][1],f[2][1])+1; f[3][1]=f[3][1]+1; continue; } if(a==2) { f[3][0]=min(f[3][0],min(f[2][0],f[1][0]))+1; f[2][0]=min(f[2][0],f[1][0]); f[1][0]=f[1][0]+1; f[1][1]=min(f[3][1],min(f[2][1],f[1][1]))+1; f[2][1]=min(f[3][1],f[2][1]); f[3][1]=f[3][1]+1; continue; } f[3][0]=min(f[3][0],min(f[2][0],f[1][0])); f[2][0]=min(f[2][0],f[1][0])+1; f[1][0]=f[1][0]+1; f[1][1]=min(f[3][1],min(f[2][1],f[1][1]))+1; f[2][1]=min(f[3][1],f[2][1])+1; } int ans=1e9+7; for(int i=1;i<=3;i++) for(int j=0;j<=1;j++) ans=min(ans,f[i][j]); printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/LLTYYC/p/9864705.html

你可能感兴趣的文章
linux安装openldap步骤
查看>>
九度OJ 1035:找出直系亲属(二叉树)
查看>>
hive left outer join的问题
查看>>
32位Win7下安装与配置PHP环境(二)
查看>>
图片、浏览器-HTML5/CSS3系列教程:使用SVG图片-by小雨
查看>>
[学习笔记]node.js中的path.extname方法
查看>>
[学习笔记]HTTP协议
查看>>
警告:Assigning to 'id<Delegate>' from incompatible type 'ViewController *const_st
查看>>
项目中字体比较粗,比较虚。
查看>>
杨延锟--ORACLE博客
查看>>
Web开发环境搭建 Eclipse-Java EE 篇
查看>>
python源码学习
查看>>
jdaaaaaavid --github
查看>>
xargs
查看>>
铁路微机监测分析与研究
查看>>
SpringBoot Tomcat启动报错
查看>>
css outline实践研究
查看>>
fackbook的Fresco的Image Pipeline以及自身的缓存机制
查看>>
Casablanca发布:一个用C++访问云的本地类库
查看>>
[转载]Python调用Shell 之间变量传递
查看>>