区间-还是回文

本文介绍了一种使用动态规划算法来计算将任意字符串转换为回文串所需的最小成本的方法。通过构建二维DP数组,文章详细解释了如何递推地计算不同子串区间的最优成本。
package 动态规划.区间;
import java.util.Scanner;


/*
 * 长度为N的字符串,变成回文数的花费
 * 如果是要一维数组的话dp[]不行
 * 因为有可能删除中间的字符,有可能删除最后一个字符,删除的字符所在的区间不确定所以采用二维数组
 * dp[i][j]:表示i~j范围内的花费,最后的花费必然是dp[1][n]
 * 1:首先只保留对某个字符的最小花费
 * 2: 删除或者增加i,j位置的字符,dp[i][j]=min(dp[i+1][j]+arr[i],dp[i][j-1]+arr[j)
 *  当arr[i]=arr[j]就多出现一种情况,dp[i-1][j-1]
 * abcd举例
 * 首先确定dp[1][2]的花费
 * 然后在确定dp[1][3]的花费,确定1~3的花费,就需要确定1~2和2~3的花费,因为1~2已经求出,接下来求2~3,------->后往前推
 * 1~4,因为1~3已经求出,接下来需要求出2~4,2~3已经求出,就只需要求出3~4的花费
 * 当1==4的时候,就出现一种情况,这种情况添加2~3的值就行了
 */
public class 还是回文 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int m = sc.nextInt();
char[] s = sc.next().toCharArray();
int arr[] = new int[26];
for (int i = 0; i < n; i++) {
arr[sc.next().charAt(0) - 'a'] = Math.min(sc.nextInt(),
sc.nextInt());
}


int dp[][] = new int[m][m];
for (int i = 1; i < m; i++) {
for (int j = i - 1; j >= 0; j--) {
dp[j][i] = Math.min(dp[j + 1][i] + arr[s[j] - 'a'],
dp[j][i - 1] + arr[s[i] - 'a']);
if (s[i] == s[j]) {
dp[j][i] = Math.min(dp[j][i], dp[j + 1][i - 1]);
}
}
}


System.out.println(dp[0][m - 1]);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值