zoukankan      html  css  js  c++  java
  • [宁波集训]0827Day1

    1、(CF771D Bear and Company)(原题,比赛时改为多组数据)

    一道毒瘤(dp)题,(dp[i][j][k][0/1])表示有(i)(V),有(j)(K),有(k)(X)所用的最小移动数

    那么可以得出状态转移方程:

    [if(i) dp[i][j][k][1]=min(dp[i][j][k][1],min(dp[i-1][j][k][0],dp[i-1][j][k][1])+V[i]-(i-1+min(j,sumk[V[i]])+min(k,sumx[V[i]]))); ]

    [if(j) dp[i][j][k][0]=min(dp[i][j][k][0],dp[i][j-1][k][0]+K[j]-(j-1+min(i,sumv[K[j]])+min(k,sumx[K[j]]))); ]

    [if(k) dp[i][j][k][0]=min(dp[i][j][k][0],min(dp[i][j][k-1][0],dp[i][j][k-1][1])+X[k]-(k-1+min(j,sumk[X[k]])+min(i,sumv[X[k]]))); ]

    #include<bits/stdc++.h>
    using namespace std;
    int sumv[1000000],sumk[1000000],T,sumx[1000000],dp[200][200][200][2],V[10000],K[10000],X[10000];
    char y[100000],x[100000];
    int main(){
        scanf("%d",&T);
        while (T--){
            memset(dp,0x3f,sizeof(dp));
            dp[0][0][0][0]=0;
            dp[0][0][0][1]=0;
            scanf("
    %s",x);
            int N=strlen(x);
            for (int i=0;i<N;i++){
                sumv[i]=sumv[i-1];
                sumk[i]=sumk[i-1];
                sumx[i]=sumx[i-1];
                if (x[i]=='V'){
                    sumv[i]=sumv[i-1]+1;
                    V[sumv[i]]=i;
                }else if (x[i]=='K'){
                    sumk[i]=sumk[i-1]+1;
                    K[sumk[i]]=i;
                }else{
                    sumx[i]=sumx[i-1]+1;
                    X[sumx[i]]=i;
                }
            }
            for (int i=0;i<=sumv[N-1];i++){
                for (int j=0;j<=sumk[N-1];j++){
                    for (int k=0;k<=sumx[N-1];k++){
                        if (i+j+k==0){
                            continue;
                        }
                        if (i) dp[i][j][k][1]=min(dp[i][j][k][1],min(dp[i-1][j][k][0],dp[i-1][j][k][1])+V[i]-(i-1+min(j,sumk[V[i]])+min(k,sumx[V[i]])));
                        if (j) dp[i][j][k][0]=min(dp[i][j][k][0],dp[i][j-1][k][0]+K[j]-(j-1+min(i,sumv[K[j]])+min(k,sumx[K[j]])));
                        if (k) dp[i][j][k][0]=min(dp[i][j][k][0],min(dp[i][j][k-1][0],dp[i][j][k-1][1])+X[k]-(k-1+min(j,sumk[X[k]])+min(i,sumv[X[k]])));
                    }
                }
            }
            printf("%d
    ",min(dp[sumv[N-1]][sumk[N-1]][sumx[N-1]][0],dp[sumv[N-1]][sumk[N-1]][sumx[N-1]][1]));
        }
    }
    
  • 相关阅读:
    3372 选学霸
    3556 科技庄园
    1025 选菜
    UVA 437 The Tower of Babylon巴比伦塔
    3641 上帝选人
    tyvj P1175 机器人
    1692 子集和的目标值
    1689 建造高塔
    NOI2002 贪吃的九头龙
    NYOJ110 剑客决斗
  • 原文地址:https://www.cnblogs.com/owencodeisking/p/9553723.html
Copyright © 2011-2022 走看看