街道灯光
时间:2019-08-19
本文章向大家介绍街道灯光,主要包括街道灯光使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题面:
n盏灯,每盏灯可以点亮自己和与它相邻的灯,点亮第i盏灯的代价为 w[i] ,你有k次强行交换两盏灯花费的机会,问照亮整个街道的最小花费。
输入:第一行:n,k
第二行:w[1]~w[n]
输出:最小代价
题解:设dp [i] [x] [y] [a] [b]表示考察了前 i盏灯,最后两盏灯的亮灭状态分别为 x,y,已经有 a 盏亮的灯被换走了,已经有 b 盏灭的灯被换上的最小代价。
只有四种转移:点灯;不点灯;点亮后被换走;不点从别的地方弄个灯过来。复杂度 O(nk2)。
‘灯点亮被换走’转移时加上代价,‘从别的地方弄个灯过来’不花代价,,最后只要看 a=b 的 dp数组就可以了
#include <bits/stdc++.h> #define ll long long using namespace std; inline ll read() { char ch=getchar(); int s=0,f=0; while(!(ch<='9'&&ch>='0')) {f|=ch=='-';ch=getchar();} while(ch<='9'&&ch>='0') {s=(s<<3)+(s<<1)+ch-'0';ch=getchar();} return f?-s:s; } const int K = 10; const int N = 250005; const long long INF = 1e17; int n, k; int w[N]; //考察了前 i盏灯,最后两盏灯的亮灭状态分别为 x,y,已经有 a 盏亮的灯被换走了,已经有 b 盏灭的灯被换上了的最小代价, long long dp[2][2][2][K][K]; int main() { freopen("light.in","r",stdin); freopen("light.out","w",stdout); scanf("%d%d", &n, &k); for (int i = 1; i <= n; ++i) w[i] = read(); memset(dp, 0x3f, sizeof dp); dp[0][1][0][0][0] = 0; for (int i = 0; i < n; ++i) { int nxt = ~i & 1, pre = i & 1, val = w[i + 1]; memset(dp[nxt], 0x3f, sizeof dp[nxt]); for (int a = 0; a <= k; ++a) for (int b = 0; b <= k; ++b) for (int x = 0; x < 2; ++x) for (int y = 0; y < 2; ++y) { if (dp[pre][x][y][a][b] > INF) continue; dp[nxt][y][1][a][b]=min(dp[nxt][y][1][a][b],dp[pre][x][y][a][b] + val);//点亮这盏灯 if (x || y)//这盏灯不点 dp[nxt][y][0][a][b]=min(dp[nxt][y][0][a][b], dp[pre][x][y][a][b]); if (b < k)//有资格被资助 dp[nxt][y][1][a][b + 1]=min(dp[nxt][y][1][a][b + 1], dp[pre][x][y][a][b]); if (a < k && (x || y))//有资格资助别人 dp[nxt][y][0][a + 1][b]=min(dp[nxt][y][0][a + 1][b], dp[pre][x][y][a][b] + val); } } long long ans = INF; for (int i = 0; i <= k; ++i) for (int x = 0; x < 2; ++x) for (int y = 0; y < 2; ++y) if (x || y) ans = min(ans, dp[n & 1][x][y][i][i]); printf("%lld\n", ans); return 0; }
原文地址:https://www.cnblogs.com/lyflalala/p/11379462.html
- Python接口自动化-3-POST请求
- 【Python环境】Python中的结构化数据分析利器-Pandas简介
- JAVA中使用Jedis操作Redis
- Tomcat搭建文件服务器
- Windows下SLmail邮件服务器缓冲区溢出理解及实验
- java使用mina和websocket通信
- 【机器学习】10 种机器学习算法的要点
- 写一个BASIC认证的https协议
- java发送邮件功能,以发送qq邮件为例
- spring boot加载复杂的yml文件获取不到值的问题
- JUC包下的CountDownLatch,CyclicBarrier,Semaphore
- java队列,ArrayBlockingQueue
- 多线程使用wait和notify做生产者消费者模型导致线程全部假死
- 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go开源游戏服务器框架——Pitaya
- 性能分析之pidstat新版本的%wait和mpstat的%iowait、top的wa
- 走进Java接口测试之整合ELK实现日志收集
- 【一天一大 lee】 监控二叉树 (难度:困难)-Day20200922
- 网络学习笔记2——物理层基础(信号与系统)(未完待续)
- 浅谈 React 中的 XSS 攻击
- Chrome 80+ 跨域Samesite 导致的cookie not found 解决方法
- 再不迁移到Material Design Components 就out啦
- hbase 学习
- 再谈Fragment
- java线程池(四):ForkJoinPool的使用及基本原理
- 算法书中算法
- Robo3T 与 NaviCat 的安装
- 牛客网2017年校招真题-1
- 实例分割新思路之SOLO v1&v2深度解析