Golang回文数变换代价

douyin LSY_HELLOWORLD,已成功入职互联网大厂,请关注我,了解非科班的程序员的工作生活把
题目来源 360春招2021编程题
所谓回文数就是一个数字,从左边读和从右边读的结果都是一样的,例如12321。

现在有一个只包含1、2、3、4的数字,你可以通过在任意位置增加一位数字或者删除一位数字来将其变换成一个回文数。但是增加或删除不同数字所需要的代价是不一样的。

已知增加和删除每个数字的代价如下:

增加一个1,代价:100;删除一个1,代价:120。

增加一个2,代价:200;删除一个2,代价:350。

增加一个3,代价:360;删除一个3,代价:200。

增加一个4,代价:220;删除一个4,代价:320。

请问如何通过最少的代价将一个数字变换为一个回文数。当然,如果一个数字本身已经是一个回文数(包括一位数,例如:2),那么变换的代价为0。
输入描述:

单组输入。

输入一个由1、2、3、4组成的正整数,正整数位数<=100位。【提示:采用字符串输入】

输出描述:

输出一个整数,表示将输入数字变换为一个回文数所需的最少代价。

输入例子1:

12322

输出例子1:

300

例子说明1:

增加一个1并增加一个2,将输入正整数变为1223221或者2123212,所需代价最小,为:100+200=300。

package main

import (
	"fmt"

)

func main() {
	add := []int{0, 100, 200, 360, 220} //增加的代价
	del := []int{0, 120, 350, 200, 320} //删除的代价
	ss := ""
	fmt.Scan(&ss)
	n := len(ss)
	dp := make([][]int, n)
	for i := range dp {
		dp[i] = make([]int, n)
	}
	var dfs func(l, r int) int
	dfs = func(l, r int) int {
		if r <= l {
			return 0
		}
		if dp[l][r] == 0 {
			if ss[l] == ss[r] {
				dp[l][r] = dfs(l+1, r-1)
			} else {
				dp[l][r] = min(min(dfs(l+1, r)+add[ss[l]-'0'], dfs(l+1, r)+del[ss[l]-'0']), min(dfs(l, r-1)+add[ss[r]-'0'], dfs(l, r-1)+del[ss[r]-'0']))
			}

		}
		return dp[l][r]
	}

	fmt.Println(dfs(0, n-1))

}
func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSY_HELLOWORLD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值