阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)
文章目录
- 1. 题目
- 2. 解题
1. 题目
有n个房子在一列直线上,现在Bob需要给房屋染色,共有k种颜色。
每个房屋染不同的颜色费用也不同,Bob希望有一种染色方案使得相邻的房屋颜色不同。
但Bob计算了使相邻房屋颜色不同的最小染色费用,发现花费非常高。
于是Bob想选择一个区间作为主题步行街,在这个区间中的所有房子必须染成同一个颜色。Bob觉得这样可能能降低总花费,但是也不想让这个步行街太长。
Bob认为步行街的长度最多为 ‘t’。
但这个花费太难计算,Bob打算交给你来计算。
你能算出将这些房子进行染色的最小花费是多少吗?
费用通过一个nxk
的矩阵给出,比如costs[0][0]
表示房屋0染颜色0的费用,costs[1][2]
表示房屋1染颜色2的费用。
t 是一个整数,表示有最多有多少个房屋颜色相同。
房子总数: 1 <= n <= 100
颜色总数: 1 <= k <= 100
步行街长度上限: 1 <= t <= 10
房屋染色费用: 1 <= cost[i][j] <= 1000示例
样例1
输入:
costs = [[14,2,11],[11,14,5],[14,3,10]]
t = 2
输出: 10
说明:
三个屋子分别使用第1,2,1种颜色,总花费是10。
在这个样例中你不需要建造步行街。样例2
输入:
costs = [[14,2,11],[11,14,5],[14,3,10]]
t = 2
输出: 10
说明:
你可以在[1,2]的区间中建造一个步行街,
这样序号为1和2的两个房子可以染成相同颜色。
因此如果这三个房子的颜色为[2,2,1],总花费为10.
如果你在[2,3]的区间中建造一个步行街,
最小的花费是11(1+5+5),大于10,因此不是最优解。
你无法在[1,3]中建造步行街,因为步行街总长度为3,大于t。
来源:https://tianchi.aliyun.com/oj/15179470890799741/85251759933690470
2. 解题
题目意思是最多只能有一个步行街,我理解错了,以为是不限制
错误代码:
class Solution {public:/*** @param costs: costs of paint ith house into color j* @param t: maximum length of street* @return: minimum costs of painting all houses*/int paintHouseIII(vector<vector<int>> &costs, int t) {// Write your code here.int n = costs.size(), col = costs[0].size(), i, j;vector<vector<vector<int>>> dp(n, vector<vector<int>>(col, vector<int>(t+1, INT_MAX)));// dp[i][c][k] 表示 i房子刷完了,其是 c 颜色,c 颜色连续了 k 次 的最小花费for(j = 0; j < col; ++j)dp[0][j][1] = costs[0][j];for(i = 1; i < n; ++i){for(int c1 = 0; c1 < col; ++c1){for(int c2 = 0; c2 < col; ++c2){if(c1 != c2){for(int k = 1; k <= t; ++k){if(dp[i-1][c1][k] == INT_MAX)continue;dp[i][c2][1] = min(dp[i][c2][1], costs[i][c2]+dp[i-1][c1][k]);}}else{for(int k = 1; k < t; ++k){if(dp[i-1][c1][k] == INT_MAX)continue;dp[i][c2][k+1] = min(dp[i][c2][k+1], costs[i][c2]+dp[i-1][c1][k]);}}}}}int ans = INT_MAX;for(i = 0; i < col; ++i)for(j = 1; j <= t; ++j)ans = min(ans, dp[n-1][i][j]);return ans;}
};
参考大佬的题解:
正确解:
class Solution {public:/*** @param costs: costs of paint ith house into color j* @param t: maximum length of street* @return: minimum costs of painting all houses*/int paintHouseIII(vector<vector<int>> &costs, int t) {// Write your code here.int n = costs.size(), col = costs[0].size(), i, j, k, c1, c2;vector<vector<vector<int>>> dp(n, vector<vector<int>>(col, vector<int>(2, INT_MAX)));// dp[i][c][0 or 1] 表示 i 房子刷完 c 颜色,还没有步行街0,有步行街1,的最小花费for(j = 0; j < col; ++j)dp[0][j][0] = dp[0][j][1] = costs[0][j];//初始化vector<vector<int>> value(n, vector<int>(n, 0));for(j = 0; j < col; ++j){for(i = 0; i < n; ++i)//房子都刷 j 颜色的花费前缀和{if(i == 0)value[i][j] = costs[i][j];elsevalue[i][j] = value[i-1][j] + costs[i][j];}}for(i = 1; i < n; ++i){for(c1 = 0; c1 < col; ++c1){for(c2 = 0; c2 < col; ++c2){if(c1 != c2)//颜色不一样{dp[i][c2][0] = min(dp[i][c2][0], dp[i-1][c1][0]+costs[i][c2]);dp[i][c2][1] = min(dp[i][c2][1], dp[i-1][c1][1]+costs[i][c2]);}}//颜色一样,可以跟前面组成步行街for(j = i-1; j >= 0; --j)//[j, i] 区间为同一颜色 c1 的步行街{if(i-j+1 > t)break;dp[i][c1][1] = min(dp[i][c1][1], dp[j][c1][0]+value[i][c1]-value[j][c1]);// 前面没有步行街0, + 加上后面都是 c1 颜色的花费}}}int ans = INT_MAX;for(j = 0; j < col; ++j)ans = min(ans, min(dp[n-1][j][0], dp[n-1][j][1]));return ans;}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
阿里云 超级码力在线编程大赛初赛 第3场 题目2. 房屋染色(DP)相关推荐
- 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)
文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683739284070 2. 解题 按道 ...
- 阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end
文章目录 1. 题目 2. 解题 1. 题目 样例1: 输入: "abcd" "bcda" 输出: true样例2: 输入: "abcd" ...
- 阿里云 超级码力在线编程大赛初赛 第3场 题目1. 最大公倍数
文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15179470890799741/85251759933690467 2. 解题 看的 ...
- 阿里云 超级码力在线编程大赛初赛 第3场 题目4. 完美字符串
文章目录 1. 题目 2. 解题 1. 题目 描述 定义若一个字符串的每个字符均为'1',则该字符串称为完美字符串. 给定一个只由'0'和'1'组成的字符串s和一个整数k. 你可以对字符串进行任意次以 ...
- 阿里云 超级码力在线编程大赛初赛 第2场 题目3. 五字回文
文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683722506852 2. 解题 注意 ...
- 阿里云 超级码力在线编程大赛初赛 第2场 题目1. 三角魔法
文章目录 1. 题目 2. 解题 1. 题目 题目来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683722506851 2. 解题 ...
- 阿里云 超级码力在线编程大赛初赛 第1场(第245名)
文章目录 1. 比赛结果 2. 题目 1. 树木规划 2. 正三角形拼接 3. 大楼间穿梭 4. 对称前后缀 1. 比赛结果 通过了 3 题,第245名,进入复赛了,收获 T恤 一件,哈哈. 2. 题 ...
- 超级码力在线编程大赛初赛第1场-1-树木规划题解
目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...
- 超级码力在线编程大赛初赛 第2场 1.三角魔法
超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...
最新文章
- vs2008页面布局GridLayout绝对定位的设置
- Linux的项目中积累的实际工作技巧
- linux ed 命令的用法
- CSS3 nth 伪类选择器
- Spark 键值对RDD操作
- 1 在c语言中不正确的常量是 a0xf6,C语言第三章在线测试题目及答案
- 利用 python 批量修改文件名
- 10款最佳Python开发工具推荐,每一款都是神器!
- 单条知识:什么是平面束方程
- 安装软件一直报错:为了对电脑进行保护,已经阻止此应用。管理员已阻止你运行此应用。有关详情信息,请与管理员联系。
- python统计(二)假设检验
- Excel-数据透视表快捷操作--数值占比汇总
- 运筹与决策(二)excel画图、公式与函数用法
- php 获取文章内容首图,关于文章的首图及图片版权问题
- 50 岁的程序员该何去何从?
- 2020!前端开发应知网站(墙裂推荐!)
- CVE-2020-2905: VirtualBox 虚拟机逃逸漏洞通告
- FASTX-Toolkit
- 汇编实验1 两个多位十进制数相加的实验
- promethues+alertmanager+grafana监控docker容器和报警—基于手动配置和文件自动发现—详细文档