NYOJ 1023 还是回文(DP,花最少费用形成回文串)

 1 /*
 2    题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费。
 3    那么,将字符串变成回文串的最小花费是多少呢?
 4
 5    思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字符串中删除这个字符 x
 6          同样也能形成回文串!
 7          所以我们只记录删除,和增加这个字符 x 的最小的费用就好了!->转变成添加多少个字符形成回文串费用最少!
 8
 9          str[i]!=str[k]
10          dp[i][j]=min(dp[i][j-1]+cost[str[k]-‘a‘], dp[i+1][j-1]+cost[str[i]-‘a‘]) ;
11
12          str[i]==str[k]
13          dp[i][j]=dp[i+1][j-2];
14
15 */
16 #include<iostream>
17 #include<cstring>
18 #include<cstdio>
19 #include<algorithm>
20 #define N 2005
21 using namespace std;
22
23 int dp[N][N];
24
25 int cost[30];
26
27 char str[N];
28
29 int main(){
30     int m, n;
31     while(scanf("%d%d", &m, &n)!=EOF){
32         scanf("%s", str+1);
33         memset(cost, 0, sizeof(cost));
34         while(m--){
35            char ch;
36            int a, b;
37            getchar();
38            scanf("%c %d %d", &ch, &a, &b);
39            cost[ch-‘a‘]=min(a, b);
40         }
41         for(int i=1; i<=n; ++i)
42            dp[i][1]=0;
43         for(int j=2; j<=n; ++j)
44            for(int i=1; i+j-1<=n; ++i){
45                int k=i+j-1;
46                if(str[i]!=str[k])
47                   dp[i][j]=min(dp[i][j-1]+cost[str[k]-‘a‘], dp[i+1][j-1]+cost[str[i]-‘a‘]) ;
48                else dp[i][j]=dp[i+1][j-2];
49            }
50
51         printf("%d\n", dp[1][n]);
52     }
53     return 0;
54 } 
时间: 2024-08-04 20:18:34

NYOJ 1023 还是回文(DP,花最少费用形成回文串)的相关文章

Light OJ 1258 Making Huge Palindromes 末尾添加最少字符变回文串

题目来源:Light OJ 1258 Making Huge Palindromes 题意:末尾添加最少的字符是使输入的串变成回文 输出长度 思路:直接KMP匹配出它和它反串的最大匹配 n减去它就是要添加的数量 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000010; char a[maxn], p[maxn]; int

NYOJ 99单词拼接(有向图的欧拉(回)路)

1 /* 2 NYOJ 99单词拼接: 3 思路:欧拉回路或者欧拉路的搜索! 4 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 5 有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 6 有向图的欧拉回路:所有的节点都有In[i]==Out[i] 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cs

判断一个数是否为回文数,字符串是否为回文字符串

使用C语言编写程序 判断一个数是否为回文数.(ps:回文数也是一个数字,数字的特点是正反序是同一个数字,如12321,3443就是回文数). 要判断该数字是否为回文数,可以通过模除得到该数的反序数字,进行比较是否相等来判读. 具体实现如下: void Practice() { int num, value, flag, var; value = 0; flag = 1; scanf("%d", &num); var = num; while(num) {//value存储num

【Python3练习题 025】 一个数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同

[Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同 x = input('请输入任意位数的数字:') if x == x[::-1]:     print('%s是个回文数' % x) else:     print('%s不是回文数' % x)   原文地址:https://www.cnblogs.com/jackzz/p/9125539.html

139. 回文子串的最大长度(回文树/二分,前缀,后缀和,Hash)

题目链接 : https://www.acwing.com/problem/content/141/ #include <bits/stdc++.h> using namespace std; const int MAXN = 1000005 ; const int N = 26 ; struct Palindromic_Tree { //cnt最后count一下之后是那个节点代表的回文串出现的次数 int next[MAXN][N] ;//next指针,next指针和字典树类似,指向的串为当

SharePoint 2013/2010 在一个列表或文档库内移动列表项,文档和目录位置而保持last modify by 等系统字段保持不变

本文讲述SharePoint 2013/2010 在一个列表或文档库内移动列表项.文档和目录位置而保持last modify by 等系统字段保持不变的解决方式. 近期遇到客户一个需求,在一个列表或文档库内移动列表项,文档和目录位置而保持last modify by 等系统字段保持不变. 研究出来了.不敢独享.特此共享出来给同鞋们做參考: using Microsoft.SharePoint; using System; using System.Collections.Generic; usi

(转载)Excel文档保存的时候,提示“文档未保存”

亲测,成功搞定 Excel文档保存的时候,提示“文档未保存”? 先打开你需要处理的excel,然后打开工具栏--宏--录制新宏--确定--停止录制宏--宏-宏--编辑--复制以下程序Sub 恢复保存()     name0 = ActiveWorkbook.Name     j = Sheets.Count     For i = 1 To j         Sheets(1).Visible = -1         Sheets(1).Move         Sheets(1).Move

[课]10.1闪回查询的三种方式:闪回查询/闪回版本查询/闪回事务查询

数据库版本 1.1闪回查询演示 1.2闪回版本查询演示 1.3闪回事务查询演示 在做闪回事务查询时候,我们需要使用ORACLE提供的一个系统视图FLASHBACK_TRANSACTION_QUERY.闪回事务查询与闪回版本查询之间有着密切的关系,从刚才我们实验的闪回版本查询中可以知道有一个伪列VERSIONS_XID,那么闪回事务查询就是通过这个伪列与闪回版本查询发生关联. 我们现在查看一下该表的表结构: 开始演示:

Winform读取文档。然后创建,奇数行保存一个文档,偶数行保存一个文档

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;using System.Text.RegularExpressions; namespace TextModify