阿里云 超级码力在线编程大赛初赛 第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]的区间中建造一个步行街,
这样序号为12的两个房子可以染成相同颜色。
因此如果这三个房子的颜色为[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阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP协议以及三次握手

TCP协议&#xff0c;传输控制协议&#xff08;英语&#xff1a;TransmissionControl Protocol&#xff0c;缩写为 TCP&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由IETF的RFC793定义。 tcp通信需要经过创建连接、数据传送、终止连接三个步骤…

02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)

文章目录作业1&#xff1a;初始化1. 神经网络模型2. 使用 0 初始化3. 随机初始化4. He 初始化作业2&#xff1a;正则化1. 无正则化模型2. L2 正则化3. DropOut 正则化3.1 带dropout的前向传播3.2 带dropout的后向传播3.3 运行模型作业3&#xff1a;梯度检验1. 1维梯度检验2. 多…

LeetCode 第 34 场双周赛(385/2842,前13.5%)

文章目录1. 比赛结果2. 题目1. LeetCode 5491. 矩阵对角线元素的和 easy2. LeetCode 5492. 分割字符串的方案数 medium3. LeetCode 5493. 删除最短的子数组使剩余数组有序 medium4. LeetCode 5494. 统计所有可行路径 hard1. 比赛结果 做出来3题&#xff0c;最后一题动态规划&a…

TCP程序流程及服务器客户端

Tcp服务器创建&#xff1a; import socket # 服务器的端口号 PORT 9000 # 创建套接字socket对象&#xff0c;用于进行通讯 # scoket.SOCK_STREAM 表明使用tcp协议&#xff0c;流式协议 # 监听socket server_sock socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 为…

LeetCode 1576. 替换所有的问号

文章目录1. 题目2. 解题1. 题目 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c; 请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ‘?’ 字符。 题目测试用例保证 除 ‘?’ 字符…

tcp十种状态

CLOSED&#xff1a;表示关闭状态&#xff08;初始状态&#xff09;。 LISTEN&#xff1a;该状态表示服务器端的某个SOCKET处于监听状态&#xff0c;可以接受连接。 SYN_SENT&#xff1a;这个状态与SYN_RCVD遥相呼应&#xff0c;当客户端SOCKET执行CONNECT连接时&#xff0c;它首…

TCP的2MSL问题

2MSL (Maximum SegmentLifetime) TIME_WAIT状态的存在有两个理由&#xff1a; 让4次挥手关闭流程更加可靠&#xff1b;4次挥手的最后一个ACK是是由主动关闭方发送出去的&#xff0c;若这个ACK丢失&#xff0c;被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TI…

LeetCode 1577. 数的平方等于两数乘积的方法数(双指针)

文章目录1. 题目2. 解题1. 题目 给你两个整数数组 nums1 和 nums2 &#xff0c;请你返回根据以下规则形成的三元组的数目&#xff08;类型 1 和类型 2 &#xff09;&#xff1a; 类型 1&#xff1a;三元组 (i, j, k) &#xff0c;如果 nums1[i]2 nums2[j] * nums2[k] 其中 0…

LeetCode 1578. 避免重复字母的最小删除成本

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 和一个整数数组 cost &#xff0c;其中 cost[i] 是从 s 中删除字符 i 的代价。 返回使字符串任意相邻两个字母不相同的最小删除成本。 请注意&#xff0c;删除一个字符后&#xff0c;删除其他字符的成本不会改变。 示例 1&…

hdu2709 Sumsets 递推

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2709 感觉很经典的一道递推题 自己想了有半天的时间了。。。。比较弱。。。。 思路&#xff1a; 设f[n]表示和为n的组合数&#xff1b; 那么 当n为奇数时&#xff0c;很简单&#xff0c;相当于在f[n-1]的每一个…

python入门字符串

python 字符串str&#xff0c; ‘’, ‘’ ‘’, ‘’’ ‘’’;python没有字符&#xff0c;只有字符串hh 切片 字符串不可以修改&#xff0c;修改的话&#xff0c;类似于tuple, 修改的话&#xff0c; 只可以整体修改 tuple 也是可这样&#xff0c; 确切的说只是修改了指针…

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

文章目录1. 题目2. 解题1. 题目 样例1&#xff1a; 输入&#xff1a; "abcd" "bcda" 输出&#xff1a; true样例2&#xff1a; 输入&#xff1a; "abcd" "abdc" 输出&#xff1a; false来源&#xff1a;https://tianchi.aliyun.com/oj…

Codeforces Round #697 (Div.3) A~G解题报告与解法证明

题目大体概括 A #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std;typedef long long LL; const int N 500; LL a[N]; int sz; bool Check(LL n) {for (int i 0; i < sz; i ){if (n a[i])…

python网络编辑 socket篇

Python之路&#xff1a; socket篇 Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个socket&#xff0c;作为BSD UNIX的进程通信机制&#xff0c;通常也称做“套接字” &#xff0c;是一个通信链的句柄&#xff0c;实现不同程序…

Codeforces Round #698 (Div. 2) A-E解题报告与解法证明

Codeforces Round #698 (Div. 2) A-E解题报告与解法证明 题目解法总体概括 A Nezzar and Colorful Balls #include <bits/stdc.h> using namespace std;const int N 110; int a[N], f[N];int main() {int t; cin >> t;while (t -- ){static int n;scanf("%…

python开始之路—基础中的基础

python之路&#xff1a; 基础篇 一、Python 1、python是怎么来的 是在1989年吉多范罗苏姆&#xff0c;在圣诞节的时候闲着无聊自己用C语言开发的&#xff0c;一个脚本解释程序&#xff0c;作为ABC语言的一种继承。 2、有哪些公司在用 Youtube、Dropbox、BT、Quor…

第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)解题报告

第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛&#xff08;同步赛&#xff09; 题目总结 A题 切蛋糕 题目信息 解题思路 如果我们将 1/k展开到二进制的形式&#xff0c;那么就可以计算出 需要 多少块1/(2^i) 蛋糕&#xff0c;因此就可以创建出分割的方案&#xff0c;最后进行…

02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法

文章目录1. Mini-batch 梯度下降2. 理解 mini-batch 梯度下降3. 指数加权平均数4. 理解指数加权平均数5. 指数加权平均的偏差修正6. 动量Momentum梯度下降法7. RMSprop8. Adam 优化算法9. 学习率衰减10. 局部最优的问题作业参考&#xff1a; 吴恩达视频课 深度学习笔记 1. Min…

PowerDesigner建数据库模型增加自定义扩展属性

PowerDesigner自7.x新增加一个特性&#xff0c;就是允许用户通过扩展模型的方式扩展模型的属性,但到底怎用一直搞不清楚&#xff0e;今天和同事商量准备直接在程序的Metadata信息实现上直接使用pdm时&#xff0c;我们需要对其进行扩展&#xff0c;因此又碰到这个问题&#xff0…