博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NYOJ-1070诡异的电梯【Ⅰ】
阅读量:5077 次
发布时间:2019-06-12

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

这道题是个dp,主要考虑两种情况,刚开始我把状态转移方程写成了dp[i] = min(dp[i-1] + a, dp[i + 1] +b); 后来想想当推到dp[i]的时候,那个dp[i + 1]还没有推出来,所以这种方式推导出来不对,后来又看到dp[i] = min(dp[i-2]的所有情况最小值,dp[i-3]的所有情况值),其中dp[i]表示前 i 层的最小花费总和, dp[i-2]比较好理解,因为不能连着停,所以最近的那个就是dp[i - 2], dp[i - 3]意思就是停在dp[i - 2]的下一层的时候,这两种就是所有的情况了,其中dp[i-3]的时候情况稍多谢,主要中间隔了两层

dp[i - 3]时:

1. dp[i-2]和dp[i-1]层都向上或者都向下走

2. dp[i-2]向下走,dp[i-1]层 向上走

3.dp[i-2]向上走,dp[i-1]向上走

取他们当中最小的情况就是答案,代码如下:

1   2 #include 
3 #include
4 #include
5 using namespace std; 6 int dp[100005]; 7 int flo[100005];//保存各个楼层有多少人需要停 8 int main() 9 {10 int kase = 0;11 int T;12 scanf("%d", &T);13 while (T--)14 {15 memset(dp, 0, sizeof(dp));16 memset(flo, 0, sizeof(flo));17 int n, m, a, b;18 scanf("%d %d %d %d", &n, &m, &a, &b);19 for (int i = 0; i < m; i++)20 {21 int t;22 scanf("%d", &t);23 flo[t]++;24 }25 int minn;26 for (int i = 3; i <= n; i++)27 {28 //dp[i-2]中的情况,中间那一层向下或者向上,取最小 29 minn = min(flo[i - 1] * a, flo[i - 1] * b) + dp[i - 2];30 //dp[i-3]中情况,两个都向上走或者两个都向下走 31 int t1 = min(flo[i - 1] * a + flo[i - 2] * a, flo[i - 1] * b + flo[i - 2] * b);32 //dp[i-3]中的情况,上面的向上走,下面的向下走和下面的向上走,上面的向下走 33 int t2 = min(flo[i - 1] * b + flo[i - 2] * a, flo[i - 1] * a + flo[i - 2] * b);34 //取最小 35 int t3 = min(t1, t2) + dp[i - 3];36 dp[i] = min(minn, t3);37 }38 printf("Case %d: %d\n", ++kase, dp[n]);39 }40 41 return 0;42 }

 

转载于:https://www.cnblogs.com/Howe-Young/p/4186833.html

你可能感兴趣的文章
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>
VIM工具
查看>>
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>
url查询参数解析
查看>>
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
mysql编码问题
查看>>
决策树与规则引擎
查看>>
nekohtml转换html时标签变大写的问题
查看>>
Python随笔1
查看>>
夺命雷公狗---Redis---6-案例操作1(注册-登录)
查看>>