lintcode - 房屋染色

 1 class Solution {
 2 public:
 3     /*
 4      * @param costs: n x 3 cost matrix
 5      * @return: An integer, the minimum cost to paint all houses
 6      */
 7      const int inf = 0x3f3f3f3f;
 8      vector<vector<int> > dp;
 9     int minCost(vector<vector<int>> &costs) {
10         // write your code here‘
11         if(costs.size() == 0) return 0;
12         dp.resize(costs.size(), vector<int>(3,inf));
13         for(int i = 0; i < costs.size(); ++i){
14                 for(int j = 0; j < 3; ++j){
15                         if(i == 0){
16                                 dp[i][j] = costs[i][j];
17                         } else {
18                                 vector<int> tmp = color(j);
19                                 dp[i][j] = min(dp[i-1][tmp[0]], dp[i-1][tmp[1]]) + costs[i][j];
20                         }
21                 }
22         }
23         return min(dp[costs.size() - 1][0], min(dp[costs.size() - 1][1], dp[costs.size() - 1][2]));
24     }
25     vector<int> color(int x){
26         vector<int> y;
27         if(x == 0){
28                 y.push_back(1);
29                 y.push_back(2);
30                 return y;
31         } else if(x == 1){
32                 y.push_back(0);
33                 y.push_back(2);
34                 return y;
35         } else {
36                 y.push_back(1);
37                 y.push_back(0);
38                 return y;
39         }
40     }
41 };
时间: 2024-11-09 02:11:43

lintcode - 房屋染色的相关文章

LintCode刷题——打劫房屋I、II、III

打劫房屋I: 题目内容: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警.给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下. 样例: 给定 [3, 8, 4], 返回 8. 挑战: O(n) 时间复杂度 且 O(1) 存储. 算法分析: 前提:对于某一间房子i,如果盗贼要打劫该房子,则房

LintCode 534. 打劫房屋 II

在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警. 给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下. 注意事项这题是House Robber的扩展,只不过是由直线变成了圈 样例给出nums = [3,

动态规划--LintCode简单题

1.爬楼梯 题目:假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 分析:一次只能爬一步或者两步,所以走i步可由走i-1步的方法数和走i-2步的方法数相加获得: 设dp[i]为走i步的方法数目,则dp[i]=dp[i-1]+dp[i-2]; 注意:边界问题,由上面的方程可知道 i 由2开始,且dp[0]=dp[1]=1; 代码: class Solution {public:    /**     dp[i]=dp[i-1]+dp[i-2]

[lintcode the-smallest-difference]最小差(python)

题目链接:http://www.lintcode.com/zh-cn/problem/the-smallest-difference/ 给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|).返回最小差. 排好序后用两个指针分别扫描两个数组,每次更新他们的差值的绝对值.并且依据他们两个数字的大小来决定谁来移动指针. 1 class Solution: 2 # @param

BZOJ 2243: [SDOI2011]染色 树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1886  Solved: 752[Submit][Status] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完成这m个操作. In

lintcode.44 最小子数组

最小子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google

[Codevs] 1014 棋盘染色

1049 棋盘染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少.读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块.(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接) 输入描述 Input Descri

bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 7925  Solved: 2975[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完

[SDOI2011]染色

Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完成这m个操作. Input 第一行包含2个整数n和m,分别表示节点数和操作数: 第二行包含n个正整数表示n个节点的初始颜色 下面行每行包含两个整数x和y,表示x和y之间有一条无向边. 下面行每行描述一个操作: “C a b