Codeforces 706C Hard problem (DP)

原创 2016年08月30日 18:52:10
#include<math.h>
#include<string>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long  a[100005];
string str1[100005],str2[100005];
long long dp[100005][2];
int main()
{
    int t;  scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        scanf("%I64d",&a[i]);
    }
    for(int i=1;i<=t;i++)
    {
        cin>>str1[i];
        str2[i]=string(str1[i].rbegin(),str1[i].rend());
    }
    for(int i=1;i<=t;++i)
            dp[i][0]=dp[i][1]=1e15;
    dp[1][0]=0; dp[1][1]=a[1];
    int i;
    for(i=2;i<=t;i++)
    {
        if(str1[i-1]<=str1[i])
            dp[i][0]=dp[i-1][0];

        if(str1[i-1]<=str2[i])
            dp[i][1]=dp[i-1][0]+a[i];

        if(str2[i-1]<=str1[i])
            dp[i][0]=min(dp[i-1][1],dp[i][0]);

        if(str2[i-1]<=str2[i])
            dp[i][1]=min(dp[i-1][1]+a[i],dp[i][1]);

        if(dp[i][0]==1e15&&dp[i][1]==1e15)
            break;
         //printf("%d %d\n",dp[i][0],dp[i][1]);
    }
    if(i==t+1)
        printf("%I64d\n",min(dp[t][1],dp[t][0]));
    else
        printf("-1\n");
}




题意:

给定一个序列C 表示 翻转 字符串 的花费。

求使 从上到下 可以翻转 字符串  字典序不降。

最终结果可以为:

ab       (ab)<(ac)

ac


aa (aa)<(ab)<(ac)

ab

ac


bbb 不管怎么翻转 都不会使 字典序 不降。

aaa


对于字符串一定存在两种状态。翻转或者不翻转。dp【i】【0】表示不翻转 dp【i】【1】表示翻转。

i-1不翻      i翻      str1【i-1】<str2【i】 (考虑需不需要加上条件 str1【i-1】>str1【i】)不需要。。。。。 加上条件是 具体的情况下进行转换。

这个条件存在是因为当 str1【i-1】<str2【i】成立,是因为str1【i-1】>str1【i 】成立 不加条件是 状态进行转换。


i-1翻 i不翻 str【i-1】<str1【i】

i-1翻 i不翻 str2【i-1】<str2【i】

i-1不翻 i不翻 str1【i-1】<str1【i】



断网啦。。。

我的总结-动态规划(DP)

说到动态规划,最开始接触到这类型的题目是在教练上课的时候放了杭电OJ的名为“数塔”的题目,其实仅靠着没有任何算法基础而且对电脑编程处理问题的方式还不熟悉只会暴力加模拟的思维方式,着实没有除开暴力之外的...
  • mo1302267724
  • mo1302267724
  • 2015年04月06日 20:50
  • 1096

关于codeforces比赛规则介绍(转载)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike Mirz...
  • y990041769
  • y990041769
  • 2014年02月19日 08:41
  • 15413

Codeforces 11D A Simple Task 统计简单无向图中环的个数

状态压缩动态规划计算简单无向图中简单环的个数。
  • fangzhenpeng
  • fangzhenpeng
  • 2015年10月12日 19:01
  • 1209

Hard problem CodeForces - 706C (DP)

Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve himself, so h...
  • qq_36556340
  • qq_36556340
  • 2017年07月04日 22:46
  • 65

CodeForces 706C Hard problem【dp】

Description Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve ...
  • Bcwan_
  • Bcwan_
  • 2016年10月19日 01:46
  • 118

codeforces 706 C. Hard problem #367 div2

顺序给出 n 个字符串,不能交换顺序,但每个串都可以反转(reverse),代价为 ci,问能不能使得这些字符串从前往后字典序是从小到大的,并算出最小代价 dp[2][n] 记录代价,dp[0][] ...
  • HackerTom
  • HackerTom
  • 2016年08月13日 01:19
  • 210

Codeforces-706C Hard problem

题目大意: 给你n个字符串,让你把它排序成字典序,但是任何两个字符串之间不能交换,只能对每个字符串进行翻转操作,并且第i个字符串翻转的时候,会消耗c[i]的能量,然后问你,将这些字符串排成字典序的时...
  • Snow_Me
  • Snow_Me
  • 2016年08月12日 14:37
  • 398

codeforces706C Hard problem 动态规划

C. Hard problem time limit per test 1 second memory limit per test 256 megabytes in...
  • EventQueue
  • EventQueue
  • 2016年09月13日 17:14
  • 310

【Codeforces 706C . Hard problem】

. Hard problem. Hard problem time limit per test1 second memory limit per test256 megabytes input...
  • WYK1823376647
  • WYK1823376647
  • 2016年08月15日 20:29
  • 291

codeforces 706C Hard problem

Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve himself, so h...
  • ShiWaiGaoRen12345
  • ShiWaiGaoRen12345
  • 2016年08月19日 08:57
  • 159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces 706C Hard problem (DP)
举报原因:
原因补充:

(最多只允许输入30个字)