zoukankan      html  css  js  c++  java
  • 【动态规划】Vijos P1616 迎接仪式

    题目链接:

      https://vijos.org/p/1616

    题目大意:

      长度为N的字符串,只含‘j’和‘z’,可以将任意两个字符调换K次,求能够拥有的最多的'jz'串。

    题目思路:

      【动态规划】

      首先相同字符是不用调换的,一个字符最多被调换一次(a<—>b,b<—>c等价于a<—>c)

      f[i][j][z]表示前i个字符,改变了j个'j'和z个'z'后的“jz”串数。

      那么只考虑前两位,有四种情况(jj,jz,zj,zz)来转移。

       注意初始化!!!

     1 //
     2 //by coolxxx
     3 ////<bits/stdc++.h>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<string>
     7 #include<iomanip>
     8 #include<map>
     9 #include<memory.h>
    10 #include<time.h>
    11 #include<stdio.h>
    12 #include<stdlib.h>
    13 #include<string.h>
    14 //#include<stdbool.h>
    15 #include<math.h>
    16 #define min(a,b) ((a)<(b)?(a):(b))
    17 #define max(a,b) ((a)>(b)?(a):(b))
    18 #define abs(a) ((a)>0?(a):(-(a)))
    19 #define lowbit(a) (a&(-a))
    20 #define sqr(a) ((a)*(a))
    21 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
    22 #define mem(a,b) memset(a,b,sizeof(a))
    23 #define eps (1e-8)
    24 #define J 10
    25 #define MAX 0x7f7f7f7f
    26 #define PI 3.14159265358979323
    27 #define N 504
    28 #define M 104
    29 using namespace std;
    30 typedef long long LL;
    31 int cas,cass;
    32 int n,m,lll,ans;
    33 char s[N];
    34 int f[N][M][M];
    35 int main()
    36 {
    37     #ifndef ONLINE_JUDGE
    38 //    freopen("1.txt","r",stdin);
    39 //    freopen("2.txt","w",stdout);
    40     #endif
    41     int i,j,k,z;
    42 //    for(scanf("%d",&cas);cas;cas--)
    43 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
    44     while(~scanf("%d",&n))
    45 //    while(~scanf("%d",&n))
    46     {
    47         ans=0;
    48         mem(f,-12);
    49         scanf("%d%s",&k,s+1);
    50         f[0][0][0]=f[1][0][0]=0;
    51         if(s[1]=='z')f[1][0][1]=0;
    52         else f[1][1][0]=0;
    53         for(i=2;i<=n;i++)
    54         {
    55             for(j=0;j<=k;j++)
    56             {
    57                 for(z=0;z<=k;z++)
    58                 {
    59                     f[i][j][z]=max(f[i][j][z],f[i-1][j][z]);
    60                     if(s[i-1]=='j' && s[i]=='z')f[i][j][z]=max(f[i][j][z],f[i-2][j][z]+1);
    61                     else if(s[i-1]=='j' && s[i]=='j' && j>0)f[i][j][z]=max(f[i][j][z],f[i-2][j-1][z]+1);
    62                     else if(s[i-1]=='z' && s[i]=='j' && j>0 && z>0)f[i][j][z]=max(f[i][j][z],f[i-2][j-1][z-1]+1);
    63                     else if(s[i-1]=='z' && s[i]=='z' && z>0)f[i][j][z]=max(f[i][j][z],f[i-2][j][z-1]+1);
    64                     if(j==z)ans=max(f[i][j][z],ans);
    65                 }
    66             }
    67         }
    68         printf("%d
    ",ans);
    69     }
    70     return 0;
    71 }
    72 /*
    73 //
    74 
    75 //
    76 */
    View Code
  • 相关阅读:
    Outlook同步问题
    Excel下三角图解的绘制
    数据库,SQL,万恶之源?
    新年第一篇
    ArcGIS的GeoProcessing的原理及实现(1)
    如何在多个文件中查找需要的信息
    关于GIS门户(GIS Portal)的概念
    2004总结
    MapViewControl更新
    GCDPlot 0.22 介绍
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5777496.html
Copyright © 2011-2022 走看看