[USACO07OPEN]便宜的回文Cheapest Palindrome
字串S长M,由N个小写字母构成。欲通过增删字母将其变为回文串,增删特定字母花费不同,求最小花费。
题目描述见上
显然 这是一道区间DP
从两头DP,枚举长度啥的很套路了。具体细节请参见代码qwq
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register int
#define maxn 2000+5
#define maxn1 3000+5
int val[maxn],dp[maxn1][maxn1],val1,val2;
char ch[maxn1],temp[];
using namespace std;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
return x*f;
}
int main()
{
int n,m;
memset(dp,0x3f,sizeof(dp));//必须要初始化
n=read();
m=read();
scanf("%s",ch+);
for(re i=;i<=n;i++)
{
cin>>temp[];
val1=read();
val2=read();
val[temp[]-'a']=min(val1,val2);
//易得从中间插入或删除是等效的
}
for(re i=;i<=m;i++)
{
dp[i][i]=;
if(ch[i]==ch[i+]) dp[i][i+]=;
}
for(re len=;len<=m;len++)
//len必须从0枚举
//否则会少算情况(连样例都过不了QAQ)
for(re i=;i<=m;i++)
{
int j=len+i;
int x1=ch[i-]-'a';
int x2=ch[j+]-'a';
if(x1==x2) dp[i-][j+]=min(dp[i-][j+],dp[i][j]);
dp[i-][j]=min(dp[i-][j],dp[i][j]+val[x1]);
dp[i][j+]=min(dp[i][j+],dp[i][j]+val[x2]);
//每种状态都需要算一遍
//因为不知道会从哪个扩展
}
cout<<dp[][m];
return ; }
某一天,FJ从农场的左上角走到右下角,当然啦,每次他只能往右或者往下走一格。FJ把他走过的路径记录下来。现在,请你把他统计一下,所有路径中,回文串的数量(从前往后读和从后往前读一模一样的字符串称为回文串)。
题目描述见上
显然
这道题和上一道题并没有什么关系(放到这里只是因为都是奶牛题+都有回文)
滚动数组优化dp
#include<bits/stdc++.h>
#define re register int
#define LL long long
#define mod 1000000007
#define maxn 500+5
using namespace std;
LL ans;
LL f[maxn][maxn];
char field[maxn][maxn];
inline int read()
{
int x=;
char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
{
x=x*+ch-'';
ch=getchar();
}
return x;
}
inline void write(LL x)
{
if(x>) write(x/);
putchar(x%+'');
}
int n;
int main()
{
n=read();
for(re i=;i<=n;i++)
for(re j=;j<=n;j++)
cin>>field[i][j];
if(field[][]!=field[n][n])
{
write();
return ;
}
f[][]=;
for(re i=;i<=n+;i++)
for(re j=i-;j>=;j--)
for(re k=i-;k>=;k--)
{
if(field[j][i-j]==field[n+k-i+][n-k+])
f[j][k]=(f[j][k]+f[j-][k]+f[j][k-]+f[j-][k-])%mod;
else f[j][k]=;
}
for(re i=;i<=n;i++)
ans=(ans+f[i][i])%mod;
write(ans);
return ;
}
[USACO07OPEN]便宜的回文Cheapest Palindrome的更多相关文章
- [DP]P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
		
题目翻译(借鉴自@ 神犇的蒟蒻) [问题描述] 追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统.他在每头牛身 上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身 ...
 - [luoguP2890] [USACO07OPEN]便宜的回文Cheapest Palindrome(DP)
		
传送门 f[i][j] 表示区间 i 到 j 变为回文串所需最小费用 1.s[i] == s[j] f[i][j] = f[i + 1][j - 1] 2.s[i] != s[j] f[i][j] = ...
 - 洛谷P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
		
题目链接: 点我 题目分析: 玄学\(dp\) 设\(val[s[i] - 'a' + 1]\)表示字母\(s[i]\)的花费 首先发现对于一个已经回文了的串\(s[i, j]\),在\(s[i - ...
 - 洛谷 2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
		
传送门 一道最简单的区间dp,然而我还是抄了题解. //Twenty #include<algorithm> #include<iostream> #include<cs ...
 - 2018.06.29 洛谷P2890 [USACO07OPEN]便宜的回文(简单dp)
		
P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome 时空限制 1000ms / 128MB 题目描述 Keeping track of all the cows c ...
 - 便宜的回文 (USACO 2007)(c++)
		
2019-08-21便宜的回文(USACO 2007) 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 追踪每头奶牛的去向是一件棘手的任 ...
 - 算法——回文(palindrome)
		
回文(palindrome):指的是从头读到尾与从尾读到头一模一样的字符串. 分别在C.Java与Python实现回文检测: C: #include <stdio.h> #include ...
 - 便宜的回文串(区间DP)
		
题目链接:便宜的回文串 这道题刚开始其实还是没有思路的.没办法,只能看题解了... 其实我们在思考问题时,考虑到一段串增或减时会改变它的长度,所以转移时会麻烦... 但其实不用考虑那么多的问题,我们只 ...
 - 编程:使用递归方式判断某个字串是否回文(Palindrome)
		
Answer: import java.util.Scanner; public class Palindrome { private static int len;//全局变量整型数据 privat ...
 
随机推荐
- Java作业:第一次过程性考核    ——长春职业技术学院 16级网络工程
			
Java作业:第一次过程性考核 ••<结构化程序设计>•• 考核目标:初步了解Java基本语法规则,学习结构化程序设计思想. 码云链接:https://gitee.com/SoridoD/ ...
 - 一面(3) react方面
			
1.react的声明周期 getDefaultProps() getInitialState() componentWillMount() 以后组件更新不调用, 只调用一次 ...
 - 前端车牌识别SDK算法提取
			
同行业中,别人标配有的产品我有,别人没有的产品我们也有,如此才能增强竞争力,通过优化创新,前端车牌识别SDK功能,性能上,都是行业NO.1的水平.车牌识别sdk这个用于越来越多人集成了,汽车保有量日益 ...
 - Unity 关于AssetBundle读取场景
			
一. 1.关于如何打包成ab包,就不多说了,网上很多教程,siki学院也有siki老师的免费视频教程挺详细的,可以看看 http://www.sikiedu.com/my/course/74 2.为了 ...
 - Win7下“回收站已损坏,是否清空该驱动器上的回收站”解决方法
			
最近买的移动硬盘,总是不能进行安全删除,有事还会提示“回收站已损坏,是否清空该驱动器上的回收站”,可以通过下面的命令进行解决: 开始–>运行–>cmd 点确定 在cmd窗口输入rd /s ...
 - python之生成器与迭代器
			
生成器 列表生成式:li = [i for i in range(10)] 将列表生成式中[]换成()即为生成器generator 生成器保存的对象不是具体的数,而是一种算法,一种推导式,调用__ne ...
 - js显示表单的提交验证
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
 - L1-035 情人节 (15 分)
			
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805097018540032 以上是朋友圈中一奇葩贴:“2月14 ...
 - Thread类源码解析
			
源码版本:jdk8 其中的部分论证和示例代码:Java_Concurrency 类声明: Thread本身实现了Runnable接口 Runnable:任务,<java编程思想>中表示该命 ...
 - HTML5 classList使用
			
add:给元素添加一个指定的class var test = document.getElementById('test'); test.classList.add('yellow');//添加 ...