codeforces706C
Hard problem
现在有 n 个由小写字母组成的字符串。他想要让这些字符串按字典序排列,但是他不能交换任意两个字符串。他唯一能做的事是翻转字符串。
翻转第 i 个字符串需要花费 ci 的能量。他想知道将所有字符串排序最少要多少能量。
两个相邻的字符串可以相等,不一定要严格递增。
Input
第一行包含一个整数 n (2 ≤ n ≤ 100 000) — 表示字符串的数量。
第二行包含 n 个整数 ci (0 ≤ ci ≤ 109),第 i 个整数等于翻转第 i 个字符串所需的能量。
之后 n 行,每行包含一个小写英文字母。总长度不到 100 000。
Output
如果不可能有序,输出 - 1。否则输出最小所需的能量。
Example
2
1 2
ba
ac
1
3
1 3 1
aa
ba
ac
1
2
5 5
bbb
aaa
-1
2
3 3
aaa
aa
-1
Note
第二个样例中翻转字符串 2 或字符串 3。翻转字符串 3 所需能量更少。
第三个样例不合法,所以输出 - 1。
第四个样例不合法,所以输出 - 1。
sol:dp较为明显,因为i-2及之前的翻转是不影响当前的转移的,dp[i][0/1]表示在第i个字符串,当前是否翻转
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
int n;
ll Cost[N],dp[N][];
char S_Last[N],S_Now[N];
inline bool Judge(char *S1,char *S2)
{
int i,n1=strlen(S1+),n2=strlen(S2+);
for(i=;i<=min(n1,n2);i++) if(S1[i]!=S2[i])
{
return S1[i]<S2[i];
}
return (n1<=n2)?:;
}
int main()
{
int i,j;
R(n);
for(i=;i<=n;i++) R(Cost[i]);
scanf("%s",S_Last+);
memset(dp,,sizeof dp);
dp[][]=;
dp[][]=Cost[];
for(i=;i<=n;i++)
{
scanf("%s",S_Now+);
if(Judge(S_Last,S_Now))
{
dp[i][]=min(dp[i][],dp[i-][]);
}
reverse(S_Last+,S_Last+strlen(S_Last+)+);
if(Judge(S_Last,S_Now))
{
dp[i][]=min(dp[i][],dp[i-][]);
}
reverse(S_Now+,S_Now+strlen(S_Now+)+);
if(Judge(S_Last,S_Now))
{
dp[i][]=min(dp[i][],dp[i-][]+Cost[i]);
}
reverse(S_Last+,S_Last+strlen(S_Last+)+);
if(Judge(S_Last,S_Now))
{
dp[i][]=min(dp[i][],dp[i-][]+Cost[i]);
}
reverse(S_Now+,S_Now+strlen(S_Now+)+);
memmove(S_Last,S_Now,sizeof S_Last);
}
if(min(dp[n][],dp[n][])>) puts("-1");
else Wl(min(dp[n][],dp[n][]));
return ;
}
/*
input
2
1 2
ba
ac
output
1 input
3
1 3 1
aa
ba
ac
output
1 input
2
5 5
bbb
aaa
output
-1 input
2
3 3
aaa
aa
output
-1
*/
codeforces706C的更多相关文章
随机推荐
- docker 仓库搭建
阿里云服务器: 127.0.0.1(客户端) 127.0.0.2(私有服务器) 127.0.0.2作为私有仓库使用 1.下载镜像 [root@insure ~]# docker pull regist ...
- 2018-2019-2 20175105王鑫浩 实验二《Java面向对象程序设计》实验报告
一.实验步骤 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装,继承,多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 二.实验内容 (一).单元测试 1 ...
- AI 奇异值分解(SVD)
奇异值分解(Singular Value Decomposition,简称SVD),将矩阵分解为奇异向量(singular vector)和奇异值(singular value). 每个实数矩阵都有一 ...
- esp-adf Element PipeLine
audio_element: 开发基于ADF的程序软件最基本的模块就是audio_element对象.所有的编码.解码.过滤.输入流.输出流实际上都是audio_element.(这个是官方的文件我翻 ...
- Ubuntu系统多屏幕时 触摸屏如何分屏定位
有很多的使用我们需要在Ubuntu系统中使用多屏幕的情况,但是有的时候是一个屏幕的触摸屏幕,另一个屏幕是非触摸屏幕,但是问题来了, 有的时候在触摸屏幕上点击的时候竟然在非触摸的响应,这种情况非常不友好 ...
- Android学习之基础知识六—Android四种布局详解
一.Android基本布局 布局是一种可以放置多个控件的容器,它可以按照一定规律调整内部控件的位置,而且布局内部除了可以放置控件外,还可以放置布局,实现多层布局嵌套.布局和控件.布局和布局之间的关系如 ...
- IIC双向电平转换电路设计
现代的集成电路工艺加工的间隙可达0.5μm 而且很少限制数字I/O 信号的最大电源电压和逻辑电平. 为了将这些低电压电路与已有的5V或其他I/O电压器件连接起来,接口需要一个电平转换器.对于双向的总线 ...
- vba基础知识
VBA中dim,static和public,private的区别 转载的文章:出自 红袖的博客http://blog.sina.com.cn/19850701xx 1.Public和Priva ...
- spring boot + dubbo开发遇到过的异常
异常信息 NoClassDefFoundErrororg.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1162) Sessio ...
- C#宣告一个变量
在C#程序里,宣告一个变量,是件很容易的事情.如下面,宣告一个变量,并赋值: ; Console.WriteLine(type); bool type1 = false; Console.WriteL ...