LIGHT OJ 1047 - Neighbor House 【DP数塔】

本文介绍了一种解决房屋涂色问题的算法,目标是最小化涂色总成本,同时确保相邻房屋颜色不同。通过动态规划的方法实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1047 - Neighbor House

Time Limit: 0.5 second(s)Memory Limit: 32 MB

The people of Mohammadpur have decided to paint each of their houses red, green, or blue. They've also decided that no two neighboring houses will be painted the same color. The neighbors of house i are houses i-1 and i+1. The first and last houses are not neighbors.

You will be given the information of houses. Each house will contain three integers "R G B" (quotes for clarity only), where R, G and B are the costs of painting the corresponding house red, green, and blue, respectively. Return the minimal total cost required to perform the work.

Input

Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case begins with a blank line and an integer n (1 ≤ n ≤ 20) denoting the number of houses. Each of the next n lines will contain 3 integers "R G B". These integers will lie in the range [1, 1000].

Output

For each case of input you have to print the case number and the minimal cost.

Sample Input

Output for Sample Input

2

 

4

13 23 12

77 36 64

44 89 76

31 78 45

 

3

26 40 83

49 60 57

13 89 99

Case 1: 137

Case 2: 96



题意:有一排房子,每个房子可以染成三种颜色,相邻的房子不能染成相同的颜色,给出每个房子染成每种颜色的价钱,求将所有房子染色的最小花费;

思路:n最大20,枚举的话是3*2^19时间受不了,就用DP来优化呗,造成时间复杂度高的原因就是每一个中间的状态都查询了多次,为了避免这种情况,我们应该将中间状态保存起来,使每个中间结果只·计算一次:dp[i][j]:表示涂到第i房子第j种颜色的最低花费,来个循环,最后选个最小值就行了;

AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int a[1111][7],dp[1111][6];

int main()
{
	int T,N,i,j,t1,t2,Kase=0;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&N); memset(a,0,sizeof(a));
		for(i=1;i<=N;++i)
		{
			for(j=1;j<=3;++j)
			{
				scanf("%d",&a[i][j]);
			}
		}
		for(i=1;i<=N;++i)
		{
			for(j=1;j<=3;++j)
			{
				if(j==1) t1=2,t2=3;
				else if(j==2) t1=1,t2=3;
				else t1=1,t2=2;
				dp[i][j]=a[i][j]+min(dp[i-1][t1],dp[i-1][t2]);
			}
		}
		printf("Case %d: %d\n",++Kase,min(dp[N][1],min(dp[N][2],dp[N][3])));
	}
	return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值