文章目录

  • 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)相关推荐

  1. 阿里云 超级码力在线编程大赛初赛 第2场 题目4. 小栖的金字塔(超级卡特兰数+除法求模/乘法逆元)

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683739284070 2. 解题 按道 ...

  2. 阿里云 超级码力在线编程大赛初赛 第4场 题目3. from start to end

    文章目录 1. 题目 2. 解题 1. 题目 样例1: 输入: "abcd" "bcda" 输出: true样例2: 输入: "abcd" ...

  3. 阿里云 超级码力在线编程大赛初赛 第3场 题目1. 最大公倍数

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15179470890799741/85251759933690467 2. 解题 看的 ...

  4. 阿里云 超级码力在线编程大赛初赛 第3场 题目4. 完美字符串

    文章目录 1. 题目 2. 解题 1. 题目 描述 定义若一个字符串的每个字符均为'1',则该字符串称为完美字符串. 给定一个只由'0'和'1'组成的字符串s和一个整数k. 你可以对字符串进行任意次以 ...

  5. 阿里云 超级码力在线编程大赛初赛 第2场 题目3. 五字回文

    文章目录 1. 题目 2. 解题 1. 题目 来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683722506852 2. 解题 注意 ...

  6. 阿里云 超级码力在线编程大赛初赛 第2场 题目1. 三角魔法

    文章目录 1. 题目 2. 解题 1. 题目 题目来源:https://tianchi.aliyun.com/oj/15165469968503404/76745683722506851 2. 解题 ...

  7. 阿里云 超级码力在线编程大赛初赛 第1场(第245名)

    文章目录 1. 比赛结果 2. 题目 1. 树木规划 2. 正三角形拼接 3. 大楼间穿梭 4. 对称前后缀 1. 比赛结果 通过了 3 题,第245名,进入复赛了,收获 T恤 一件,哈哈. 2. 题 ...

  8. 超级码力在线编程大赛初赛第1场-1-树木规划题解

    目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...

  9. 超级码力在线编程大赛初赛 第2场 1.三角魔法

    超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...

最新文章

  1. vs2008页面布局GridLayout绝对定位的设置
  2. Linux的项目中积累的实际工作技巧
  3. linux ed 命令的用法
  4. CSS3 nth 伪类选择器
  5. Spark 键值对RDD操作
  6. 1 在c语言中不正确的常量是 a0xf6,C语言第三章在线测试题目及答案
  7. 利用 python 批量修改文件名
  8. 10款最佳Python开发工具推荐,每一款都是神器!
  9. 单条知识:什么是平面束方程
  10. 安装软件一直报错:为了对电脑进行保护,已经阻止此应用。管理员已阻止你运行此应用。有关详情信息,请与管理员联系。
  11. python统计(二)假设检验
  12. Excel-数据透视表快捷操作--数值占比汇总
  13. 运筹与决策(二)excel画图、公式与函数用法
  14. php 获取文章内容首图,关于文章的首图及图片版权问题
  15. 50 岁的程序员该何去何从?
  16. 2020!前端开发应知网站(墙裂推荐!)
  17. CVE-2020-2905: VirtualBox 虚拟机逃逸漏洞通告
  18. FASTX-Toolkit
  19. 汇编实验1 两个多位十进制数相加的实验
  20. promethues+alertmanager+grafana监控docker容器和报警—基于手动配置和文件自动发现—详细文档

热门文章

  1. mac svn工具_Cornerstone 4 for mac(svn管理工具)
  2. 【python】内建异常类的层次
  3. ann matlab,人工神经网络ann及其matlab仿真.ppt
  4. 高级IO(文件的读写)——阻塞式IO的困境、非阻塞式IO
  5. shell脚本自动备份MySQL数据库
  6. Android MVP模式简单易懂的介绍方式 (一)
  7. JS中this的四种用法
  8. Eclipse用法和技巧二十三:查看JDK源码
  9. 【笔试or面试】金山西山居2014校招笔试题
  10. IOS开发之格式化日期时间