cf706C(dp)
题目链接:http://codeforces.com/problemset/problem/706/C
题意:给出n个字符串,反转第 i 个字符串需要花费 ai,问通过反转操作将n个字符串变成升序排列,最小花费是多少,不能使其升序排列的话输出-1;
思路:dp
不难想到只有当前字符串的前一个字符串会对当前字符串产生直接影响,而每个字符串都只有反转和不反转两种状态;
我们可以用dp[i][0]表示第i个字符串不反转的情况从第0到第i个字符变成升序的需要的最小花费,dp[i][1]表示第i个字符串反转的情况从第0到第i个字符变成升序的需要的最小花费;
对于第 i 个字符串我们可以选择反转或者不反转,对于每种选择又会产生三中可能, 我们用str1, str2存储当前字符串和其反转字符串,s, rs存储前一个字符串和对应反转字符串,
那么有:
当前字符串不反转:
str1>=s&&str1>=rs
str1>=s&&str1<rs
str1>=rs&&str1<s
当前字符串反转:
str2>=s&&str2>=rs
str2>=s&&str2<rs
str2>=rs&&str2<s
想清楚了这些状态也就不难写出状态转移方程式了:
if(str1>=s&&str1>=rs){
dp[i][]=min(dp[i-][], dp[i-][]);
}else if(str1>=s){
dp[i][]=dp[i-][];
}else if(str1>=rs){
dp[i][]=dp[i-][];
}else{
ok1=false; //不反转比s, rs都要小
}
//若当前字符串反转
if(str2>=s&&str2>=rs){
dp[i][]=min(dp[i-][], dp[i-][])+a[i];
}else if(str2>=s){
dp[i][]=dp[i-][]+a[i];
}else if(str2>=rs){
dp[i][]=dp[i-][]+a[i];
}else{
ok2=false;//反转比s, rs都要小
}
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std; const int MAXN=1e5+;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll dp[MAXN][], a[MAXN];//a数组存储花费
//dp[i][0]表示第i个字符串不反转的情况从第0到第i个字符变成升序的需要的最小花费,dp[i][1]表示第i个字符串反转的情况从第0到第i个字符变成升序的需要的最小花费 int main(void){
ios::sync_with_stdio(false), cin.tie(), cout.tie();
int n;
cin >> n;
for(int i=; i<n; i++){
cin >> a[i];
}
bool flag=true;
string s, rs, str1, str2;
cin >> s;
rs=s;
reverse(rs.begin(), rs.end());
dp[][]+=a[];
for(int i=; i<n; i++){
cin >> str1;
str2=str1;
reverse(str2.begin(), str2.end());
if(flag){
bool ok1=true, ok2=true;
//**若当前字符串不反转
if(str1>=s&&str1>=rs){
dp[i][]=min(dp[i-][], dp[i-][]);
}else if(str1>=s){
dp[i][]=dp[i-][];
}else if(str1>=rs){
dp[i][]=dp[i-][];
}else{
ok1=false; //不反转比s, rs都要小
}
//若当前字符串反转
if(str2>=s&&str2>=rs){
dp[i][]=min(dp[i-][], dp[i-][])+a[i];
}else if(str2>=s){
dp[i][]=dp[i-][]+a[i];
}else if(str2>=rs){
dp[i][]=dp[i-][]+a[i];
}else{
ok2=false;//反转比s, rs都要小
}
if(!ok1&&!ok2){
flag=false;
}else if(!ok1&&ok2){
dp[i][]=inf;
}else if(ok1&&!ok2){
dp[i][]=inf;
}
}
s=str1;
rs=str2;
}
ll ans=min(dp[n-][], dp[n-][]);
if(!flag||ans>=inf){
cout << - << endl;
}else{
cout << ans << endl;
}
return ;
}
cf706C(dp)的更多相关文章
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...
- AEAI DP V3.7.0 发布,开源综合应用开发平台
1 升级说明 AEAI DP 3.7版本是AEAI DP一个里程碑版本,基于JDK1.7开发,在本版本中新增支持Rest服务开发机制(默认支持WebService服务开发机制),且支持WS服务.RS ...
- AEAI DP V3.6.0 升级说明,开源综合应用开发平台
AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...
- BZOJ 1597: [Usaco2008 Mar]土地购买 [斜率优化DP]
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4026 Solved: 1473[Submit] ...
- [斜率优化DP]【学习笔记】【更新中】
参考资料: 1.元旦集训的课件已经很好了 http://files.cnblogs.com/files/candy99/dp.pdf 2.http://www.cnblogs.com/MashiroS ...
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- px、dp和sp,这些单位有什么区别?
DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...
- android px转换为dip/dp
/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ public int dipTopx(Context context, float dpValue) { final floa ...
随机推荐
- ubuntu nohup命令用法
让程序在后台运行 该命令的一般形式nohup command & 程序在后台运行并打印日志 nohup ./china_fund.py > china_fund.file 2>&a ...
- 【转】ios内联函数 inline
ios内联函数 inline 缘由 由于在学习使用UIScrollVew开发的过程中,碰到下面这个属性(设置内边距): @property(nonatomic) UIEdgeInsets scroll ...
- Linux2.4文件系统中vfsmount、安装点的dentry、设备的dentry之间的关系【转】
本文转载自:https://blog.csdn.net/mishifangxiangdefeng/article/details/7566575 1.vfsmount.安装点的dentry.设备的de ...
- iOS SDK:iOS调试技巧
感谢原创 在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部分.通过本文的学习,我们将知道在程序中,可以使用 ...
- java: new Date().getTime() 与 System.currentTimeMillis() 与 System.nanoTime()
java使用new Date()和System.currentTimeMillis()获取当前时间戳 在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时 ...
- c# CODE REVIEW (13-11 TO 14-01)
一. 松耦合
- javscript 一些常用的工具方法
一些工作中经常会用到的js代码,可以封装成一个工具库. 积少成多,从现在开始吧! -------------- 1 . 判断一段文字的长度.要求中文相当于2个字符,非中文的相当于1个字符 String ...
- html5 手写的canvas实现
试用支持canvas的浏览器,无JS依赖,运用新的HTML5技术DrawBoard.renderDrawer('myHandWrite',{ penColor:'#FF0000', penWidt ...
- laravel基础课程---9、视图(lavarel的模板语法和tp相比怎样)
laravel基础课程---9.视图(lavarel的模板语法和tp相比怎样) 一.总结 一句话总结: lavarel的模板语法比thinkphp好用很多:和html代码配合的更好 lavarel比t ...
- Linux_服务器_03_xxx is not in the sudoers file.This incident will be reported.的解决方法
1.切换到root用户下,怎么切换就不用说了吧,不会的自己百度去. 2.添加sudo文件的写权限,命令是:chmod u+w /etc/sudoers 3.编辑sudoers文件vi /etc/sud ...