zoukankan      html  css  js  c++  java
  • codeforces 761C

    题目链接:https://codeforces.com/problemset/problem/761/C

    (dp[i][0/1][0/1][0/1])表示前 i 个字符有无数字,字母,特殊符号的最小操作次数
    向左向右移动光标找到最小的方向即可

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<cmath>
    #include<stack>
    #include<queue>
    using namespace std;
    typedef long long ll;
    
    const int maxn = 100;
    
    int n,m;
    int dp[maxn][2][2][2]; // 到第 i 行,前面有无数字,字母,特殊符号的最小操作步数 
    char s[maxn][maxn];
    
    ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }
    
    int main(){
    	memset(dp,0x3f,sizeof(dp));
    	n = read(), m = read();
    	
    	for(int i=1;i<=n;++i){ scanf("%s",s[i]); }
    	
    	dp[0][0][0][0] = 0;
    	for(int i=1;i<=n;++i){
    		dp[i][1][0][0] = dp[i-1][1][0][0];
    		dp[i][0][1][0] = dp[i-1][0][1][0];
    		dp[i][0][0][1] = dp[i-1][0][0][1];
    		dp[i][1][1][0] = dp[i-1][1][1][0];
    		dp[i][1][0][1] = dp[i-1][1][0][1];
    		dp[i][0][1][1] = dp[i-1][0][1][1];
    		dp[i][1][1][1] = dp[i-1][1][1][1];
    		for(int j=0;j<m;++j){
    			if(s[i][j] >= '0' && s[i][j] <= '9'){
    				dp[i][1][0][0] = min(dp[i][1][0][0],dp[i-1][0][0][0]+min(j,m-j));
    				dp[i][1][1][0] = min(dp[i][1][1][0],dp[i-1][0][1][0]+min(j,m-j));
    				dp[i][1][0][1] = min(dp[i][1][0][1],dp[i-1][0][0][1]+min(j,m-j));
    				dp[i][1][1][1] = min(dp[i][1][1][1],dp[i-1][0][1][1]+min(j,m-j));
    			}else if(s[i][j] >= 'a' && s[i][j] <= 'z'){
    				dp[i][0][1][0] = min(dp[i][0][1][0],dp[i-1][0][0][0]+min(j,m-j));
    				dp[i][1][1][0] = min(dp[i][1][1][0],dp[i-1][1][0][0]+min(j,m-j));
    				dp[i][0][1][1] = min(dp[i][0][1][1],dp[i-1][0][0][1]+min(j,m-j));
    				dp[i][1][1][1] = min(dp[i][1][1][1],dp[i-1][1][0][1]+min(j,m-j));
    			}else{
    				dp[i][0][0][1] = min(dp[i][0][0][1],dp[i-1][0][0][0]+min(j,m-j));
    				dp[i][1][0][1] = min(dp[i][1][0][1],dp[i-1][1][0][0]+min(j,m-j));
    				dp[i][0][1][1] = min(dp[i][0][1][1],dp[i-1][0][1][0]+min(j,m-j));
    				dp[i][1][1][1] = min(dp[i][1][1][1],dp[i-1][1][1][0]+min(j,m-j));
    			}
    		}
    	}
    	
    	printf("%d
    ",dp[n][1][1][1]);
    	
    	return 0;
    }
    
  • 相关阅读:
    JS字符串去重
    svn回退到某一版本
    WebStorm格式化代码4个空格设置
    DevExpress中 的DataGrid每一行根据其类型显示控件的种类
    各大系统刷新DNS缓存方法
    Kali Linux中前十名的Wifi攻击工具
    CentOS远程执行漏洞
    判断是否移动端的几种方法
    笔记
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/tuchen/p/13841265.html
Copyright © 2011-2022 走看看