515.Paint House-房屋染色(中等题)

本文探讨了如何通过动态规划解决房屋染色问题,确保相邻房屋颜色不同且总费用最低。给出了具体算法实现及示例。

翻转字符串

  1. 题目

    这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小。

    费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。

    注意事项
    所有费用都是正整数

  2. 样例

    costs = [[14,2,11],[11,14,5],[14,3,10]] return 10
    房屋 0 蓝色, 房屋 1 绿色, 房屋 2 蓝色, 2 + 5 + 3 = 10

  3. 题解

    动态规划题,我们看第i个房子涂什么颜色,由于总共只有三种颜色,所以当第i个房子涂红色时,第i-1个房子只能涂蓝色和绿色,依次递推。只要将这三种情况得出的答案中的最小值就是最优解。可以直接利用原数组进行递推计算,无需使用额外空间。

public class Solution {
    /**
     * @param costs n x 3 cost matrix
     * @return an integer, the minimum cost to paint all houses
     */
    public int minCost(int[][] costs) {
        if(costs==null || costs.length==0)
        {
            return 0;
        }
        int m = costs.length-1;
        for(int i = 1; i <= m; i++)
        {
            costs[i][0] += Math.min(costs[i-1][1], costs[i-1][2]);
            costs[i][1] += Math.min(costs[i-1][0], costs[i-1][2]);
            costs[i][2] += Math.min(costs[i-1][0], costs[i-1][1]);
        }
        return Math.min(Math.min(costs[m][0], costs[m][1]), costs[m][2]);
    }
}

Last Update 2016.12.4

interface PointInfo{ x:number y:number } @Entry @Component struct Canvas2Page { @State message: string = 'Hello World'; startX:number=0 startY:number=0 //终点坐标 endX:number=0 endY:number=0 //坐标的数据 infoList(){ } paint:CanvasRenderingContext2D=new CanvasRenderingContext2D() build() { Canvas(this.paint) .width("100%") .height("100%") .backgroundColor(Color.Pink) //触摸事件 .onTouch((event)=>{ //触摸类型 //手指按下 switch (event.type){ case TouchType.Down: this.startX=event.touches[0].windowX this.startY=event.touches[0].windowY this.infoList.push({ x:this.startX, y:this.startY }) break case TouchType.Up: break case TouchType.Move: this.endX=event.touches[0].windowX this.endY=event.touches[0].windowY this.infoList.push({ x:this.startX, y:this.startY }) this.draw() //手指滑动 break case TouchType.Cancel: break } }) } //绘制 draw(){ this.paint.moveTo(this.startX,this.startY) //画笔颜色 this.paint.strokeStyle="#ff0000" this.paint.lineWidth=5 //绘制 this.paint.lineTo(this.endX,this.endY) this.paint.stroke() //修改起点 this.startX=this.endX this.startY=this.endY } //贝塞尔曲线(圆滑线条) beizierDraw(){ this.paint.lineWidth=5 this.paint.strokeStyle="#00ff00" if(this.infoList.length>3){ let endX=(this.infoList.[length-1].x+this.infoList[length-2].x)/2 let endY=(this.infoList.[length-1].y+this.infoList[length-2].y)/2 //起点 let startX=this.infoList(lenth-3).x let startY=this.infoList(lenth-3).y this.paint.moveTo(startX,startY) this.paint.quadraticCurveTo(this.infoList[length-2].x,this.infoList[length-2].y,endX,endY) this.paint.stroke() } } }完善该代码
最新发布
07-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值