• codeforces 225C Barcode


    题意:给你一个矩阵,只包含 '#' 和 '.',现在每一列必须相同,最多连续y列最少连续x列相同。

    解题思路:3维dp,dp[i][j][k] 表示 第i列 ,状态j,是状态j的第K行。

    解题代码:

      1 // File Name: 225c.cpp
      2 // Author: darkdream
      3 // Created Time: 2015年03月09日 星期一 09时49分05秒
      4 #include<climits>
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 using namespace std;
     26 char str[1005][1005];
     27 int dp[1005][2][1005];
     28 int cw[1005];
     29 int cb[1005];
     30 int main(){
     31   int n , m ,x ,y;
     32   memset(dp,-1,sizeof(dp)) ;
     33   scanf("%d %d %d %d",&n,&m,&x,&y);
     34   for(int i = 1;i <= n;i ++)
     35   {
     36      scanf("%s",&str[i][1]);
     37   }
     38   for(int i = 1;i <= m;i ++)
     39   {
     40     for(int j = 1;j <= n;j ++)
     41     {
     42       if(str[j][i] == '#')
     43           cw[i] ++ ;
     44     }
     45     cb[i] = n - cw[i];
     46   }
     47   dp[1][0][1] = cb[1];
     48   dp[1][1][1] = cw[1];
     49   for(int i= 2;i <= m;i ++)
     50   {
     51      int mxcb = -1;
     52      for(int j = 1;j <= y ;j ++)
     53      {
     54           if(dp[i-1][0][j] != -1)
     55           {
     56             dp[i][0][j+1] = dp[i-1][0][j] + cb[i];
     57             if(j >= x)
     58             {
     59              if(mxcb == -1)
     60                  mxcb = dp[i-1][0][j];
     61              else 
     62                  mxcb = min(mxcb,dp[i-1][0][j]);
     63             }
     64           }
     65      }
     66      int mxcw = -1; 
     67      for(int j = 1;j <= y ;j ++)
     68      {
     69           if(dp[i-1][1][j] != -1)
     70           {
     71             dp[i][1][j+1] = dp[i-1][1][j] + cw[i];
     72             if(j >= x)
     73             {
     74              if(mxcw == -1)
     75                  mxcw = dp[i-1][1][j];
     76              else 
     77                  mxcw = min(mxcw,dp[i-1][1][j]);
     78             }
     79           }
     80      }
     81      //printf("%d %d
    ",mxcw,mxcb);
     82      if(mxcw != -1)
     83          dp[i][0][1] = mxcw + cb[i];
     84      if(mxcb != -1)
     85          dp[i][1][1] = mxcb + cw[i];
     86   }
     87   int ans = INT_MAX; 
     88   for(int i = 0 ;i < 2;i ++)
     89       for(int j = x; j <= y; j ++)
     90       {
     91         if(dp[m][i][j] != -1)
     92           ans = min(dp[m][i][j],ans);
     93       }
     94   /*for(int i = 1;i <= m;i ++)
     95   {
     96    for(int s = 0 ; s <= 1 ; s ++)
     97    {
     98     for(int j= 1;j <= y ;j ++)
     99         printf("%d ",dp[i][s][j]);
    100      printf("****");
    101    }
    102     printf("
    ");
    103   }*/
    104   printf("%d
    ",ans);
    105 return 0;
    106 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    SQL语句容易出现错误的地方-连载
    3D坦克大战游戏iOS源代码
    node.js setup wizard ended prematurely Win7安装nodejs失败解决方法
    Linux环境高级编程--出错处理(CLStatus)
    HT系统部署操作文档
    VC中常见的108个问题
    菜鸟nginx源代码剖析数据结构篇(十一) 共享内存ngx_shm_t
    Smalidea无源代码调试 android 应用
    MPAndroidChart开源图表库(三)之柱形图
    intent 显式意图和隐式意图之Activity的激活方式
  • 原文地址:https://www.cnblogs.com/zyue/p/4323206.html
Copyright © 2020-2023  润新知