F. Fence

这个刷Fence的问题看到好几个了。。。

题意

有一个栅栏,由n块宽为1cm的木板组成,第i块木板高为hi,要给他们刷上油漆,有一桶红色的可以刷a平方厘米的油漆,一桶绿色的可以刷b平方厘米的油漆。每块木板只能刷一种油漆。

现在要求出栅栏的不吸引值最小,定义不吸引值:相邻的木板不同颜色的接触长度。

上图的不吸引人值为2+3+1=6.

如果无法刷完输出-1。

思路

dp[i][j][0]表示前i块木板用了j平方的红色油漆,第i块为红色油漆

dp[i][j][1]表示前i块木板用了j平方的红色油漆,第i块为绿色油漆

首先判断第i块是否可以为红色或者绿色

转移的时候判断第i块木板和第i-1块木板的颜色加上产生的不吸引值即可。

代码

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=4e4+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f; int n,a,b,arr[N],dp[210][N][2];
int sum[210];
/*
dp[i][j][k]表示前i块总共使用了j平方red最后颜色为k的最小不吸引值
*/
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d%d%d",&n,&a,&b);
for(int i=1; i<=n; i++)
{
scanf("%d",&arr[i]);
sum[i]=sum[i-1]+arr[i];
}
memset(dp,inf,sizeof(dp));
dp[0][0][0]=dp[0][0][1]=0;
for(int i=1; i<=n; i++)
{
for(int j=0; j<=a; j++)
{
/*
最后一块可以使用red
red的总量大于当前木板的面积
red总量-当前木板面积+green总量>=前i-1块木板的面积和
*/
if(j>=arr[i]&&(j-arr[i]+b)>=sum[i-1])
{
dp[i][j][0]=min(dp[i][j][0],dp[i-1][j-arr[i]][0]);//颜色相同,不吸引值为0
dp[i][j][0]=min(dp[i][j][0],dp[i-1][j-arr[i]][1]+min(arr[i-1],arr[i]));//颜色不同,加上接触长度
}
/*
最后一块可以使用green
green总量大于当前木板的面积
green总量-当前木板面积+使用a的量>=前i-1块木板的面积和
*/
if(b>=arr[i]&&(b-arr[i]+j)>=sum[i-1])
{
dp[i][j][1]=min(dp[i][j][1],dp[i-1][j][1]);
dp[i][j][1]=min(dp[i][j][1],dp[i-1][j][0]+min(arr[i-1],arr[i]));
}
}
}
int ans=inf;
for(int i=0; i<=a; i++)
{
ans=min(ans,dp[n][i][0]);
ans=min(ans,dp[n][i][1]);
}
if(ans==inf) printf("-1");
else printf("%d\n",ans);
return 0;
}

博客

CF-234 F. Fence DP的更多相关文章

  1. CF 633 F. The Chocolate Spree 树形dp

    题目链接 CF 633 F. The Chocolate Spree 题解 维护子数答案 子数直径 子数最远点 单子数最长直径 (最长的 最远点+一条链) 讨论转移 代码 #include<ve ...

  2. CF 518D(概率dp)

    传送门:Ilya and Escalator 题意:有n个人排队进车厢,每秒只能进一个人,而且第1个人进了后面的人才能进,第一个人每秒进入车厢的概率为p,不进的概率为1-p,求t秒后进入车厢总人数的数 ...

  3. CF C. Three displays(DP+思维)

    http://codeforces.com/contest/987/problem/C 题意:给你两个n的序列要你根据第一个序列(严格单调递增的方式)在第二个序列里找3个数加起来,输出最小的一个. 思 ...

  4. Codeforces Bubble Cup 8 - Finals [Online Mirror] F. Bulbo DP

    F. Bulbo Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/575/problem/F Des ...

  5. Yahoo Programming Contest 2019.F.Pass(DP)

    题目链接 惊了这是什么F题...怎么我都能做出来...以后atcoder的比赛也不能走神了万一有个这样的F呢(CF已有多次了= =) \(f[i][j]\)表示Takahashi现在一共有\(i\)个 ...

  6. CF 494 F. Abbreviation(动态规划)

    题目链接:[http://codeforces.com/contest/1003/problem/F] 题意:给出一个n字符串,这些字符串按顺序组成一个文本,字符串之间用空格隔开,文本的大小是字母+空 ...

  7. 2016-2017 ACM-ICPC East Central North America Regional Contest (ECNA 2016) F 区间dp

    Problem F Removal GameBobby Roberts is totally bored in his algorithms class, so he’s developed a li ...

  8. 【CodeM初赛B轮】F 期望DP

    [CodeM初赛B轮]F 题目大意:有n个景点,m条无向边,经过每条边的时间需要的时间是li,在第i个景点游览花费的时间是ti,游览完第i个景点可以获得的满意度是hi.你的总时间为k,起初你等概率的选 ...

  9. CF 234 C Weather(粗暴方法)

    C. Color Stripe time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

随机推荐

  1. 数据结构(C语言版)---栈

    1.栈:仅在表尾进行插入和删除操作的线性表.后进先出LIFO. 1)表尾端(允许插入和删除的一端)为栈顶,表头端(不允许插入和删除的一端)为栈底. 2)入栈:插入元素的操作.出栈:删除栈顶元素 3)栈 ...

  2. Pytorch实现MNIST手写数字识别

    Pytorch是热门的深度学习框架之一,通过经典的MNIST 数据集进行快速的pytorch入门. 导入库 from torchvision.datasets import MNIST from to ...

  3. keras API的使用,神经网络层,优化器,损失函数,查看模型层数,compile和fit训练

    layers介绍 Flatten和Dense介绍 优化器 损失函数 compile用法 第二个是onehot编码 模型训练 model.fit  两种创建模型的方法 from tensorflow.p ...

  4. ES6中对数组的扩展

    hello,大家好,我又来了.         前面讲了字符串和数值的扩展,今天要讲的是:数组的扩展.不知道大家能否跟得上这个节奏,你们在阅读中对讲解有存在疑惑,记得留言提出来,要真正地理解,否则白白 ...

  5. 【编程之美】超时重传,滑动窗口,可靠性传输原理C语言实现

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/128003 ...

  6. 15个有趣好玩的linux shell 命令

    今天介绍一些有趣的linux shell命令,所有的命令都可以使用man + 命令名称 来查看完整的使用方法. 1,figlet 字符画 figlet 可以将英文字符串以字符画的形式输出: >& ...

  7. Spring5参考指南:组件扫描

    文章目录 组件扫描 @Component 元注解和组合注解 组件内部定义Bean元数据 为自动检测组件命名 为自动检测的组件提供作用域 生成候选组件的索引 组件扫描 上一篇文章我们讲到了annotat ...

  8. UVALive 7509 Dome and Steles

    三分 #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #d ...

  9. MyBatis学习总结(9)——使用MyBatis Generator自动创建代码

    2019独角兽企业重金招聘Python工程师标准>>> 由于MyBatis属于一种半自动的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由于手写映射文件很容易出错,所 ...

  10. vuex vue-devtools 安装

    vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们的调试效率.接下来我们就介绍一下vue-devtools的安装 chrome商店直接安装 谷歌访问助 ...