zoukankan      html  css  js  c++  java
  • CodeForces 706C Hard problem

    简单$dp$。

    $dp[i][0]$:第$i$个串放置完毕,并且第$i$个串不反转,前$i$个串字典序呈非递减的状态下的最小费用。

    $dp[i][1]$:第$i$个串放置完毕,并且第$i$个串反转,前$i$个串字典序呈非递减的状态下的最小费用。

    那么可以得到以下递推式:

    如果$s[i] > s[i - 1]$,$dpleft[ i ight]left[ 0 ight] = min(dpleft[ i ight]left[ 0 ight],dpleft[ {i - 1} ight][0])$;

    如果$s[i] > s{[i - 1]_{reverse}}$,$dpleft[ i ight]left[ 0 ight] = min(dpleft[ i ight]left[ 0 ight],dpleft[ {i - 1} ight][1])$;

    如果$s{[i]_{reverse}} > s[i - 1]$,$dpleft[ i ight]left[ {1left] { = min(dp} ight[i} ight]left[ {1left] {,dp} ight[i - 1} ight]left[ 0 ight] + cleft[ i ight])$;

    如果$s{[i]_{reverse}} > s{[i - 1]_{reverse}}$,$dpleft[ i ight]left[ {1left] { = min(dp} ight[i} ight]left[ {1left] {,dp} ight[i - 1} ight]left[ 1 ight] + cleft[ i ight])$;

    初始化的时候,令$dp[i][j]=INF$。如果$dp[n][0]$和$dp[n][1]$都是$INF$,那么输出$-1$,否则输出$min(dp[n][0],dp[n][1])$。

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    const double pi=acos(-1.0),eps=1e-8;
    void File()
    {
        freopen("D:\in.txt","r",stdin);
        freopen("D:\out.txt","w",stdout);
    }
    
    const LL INF=1e17;
    const int maxn=100010;
    char s[maxn],t[maxn];
    LL dp[maxn][2],c[maxn];
    int n;
    
    void res()
    {
        int len=strlen(s);
        for(int i=0;i<len/2;i++) swap(s[i],s[len-i-1]);
    }
    
    void ret()
    {
        int len=strlen(t);
        for(int i=0;i<len/2;i++) swap(t[i],t[len-i-1]);
    }
    
    int main()
    {
        scanf("%d",&n); memset(s,0,sizeof s); memset(t,0,sizeof t);
        for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
        for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=INF;
        scanf("%s",s); dp[1][0]=0; dp[1][1]=c[1];
        for(int i=2;i<=n;i++)
        {
            strcpy(t,s); scanf("%s",s);
    
            if(strcmp(s,t)>=0) dp[i][0]=min(dp[i][0],dp[i-1][0]);
            ret(); if(strcmp(s,t)>=0) dp[i][0]=min(dp[i][0],dp[i-1][1]); ret();
    
            res(); if(strcmp(s,t)>=0) dp[i][1]=min(dp[i][1],dp[i-1][0]+c[i]);
            ret(); if(strcmp(s,t)>=0) dp[i][1]=min(dp[i][1],dp[i-1][1]+c[i]);
    
            res(); ret();
        }
        LL ans=min(dp[n][0],dp[n][1]);
        if(ans==INF) printf("-1
    ");
        else printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    Session、Cookie、Application、ViewState和Cache 这四者的区别
    用C#构造HighChart类库,把数据转换成JSON第二阶段完成50%API,已经能满足项目要求了
    HttpHandler 在SharePoint 2010中的应用
    SharePoint 2010 在多台前端环境 还原 网站集 问题解析
    SharePoint 2010 PowerShell 系列 之 文档管理 高级应用和企业案例(文档迁移)
    设计模式策略模式
    CentOS7 安装Hbase集群
    CentOS7 安装zookeeper
    CentOS7 安装Hadoop集群环境
    Django Rest Framework关闭CSRF验证
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5810775.html
Copyright © 2011-2022 走看看