Arranging Hat

题目大意:

给你n,m n个m位的数,保证m位,问要是n个按照从小到大排序,求改变最少个数字,使得这n个按照不递增排序,求最后排序的结果。

//dp[i][j] 表示前i个数,修改不超过j次的最小值。 dp[i][j]向dp[i+1][j+k]转移
//pre[i][j]表示第i个数修改j次是由第i-1个数修改pre[i][j]次转移过来的。

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e5+;
typedef long long ll;
//dp[i][j] 表示前i个数,修改不超过j次的最小值。 dp[i][j]向dp[i+1][j+k]转移
//pre[i][j]表示第i个数修改j次是由第i-1个数修改pre[i][j]次转移过来的。
string dp[][],unite,str[];
int pre[][];
char a[][];
int n,m; string judge(int x){
string ans;
ans.clear();
for(int i=;i<m;i++){
int num=a[][i]-'';
if(num&&x) {
x--;
ans+='';
}
else ans+=num+'';
}
return ans;
}
bool Min(string u,string v){
for(int i=;i<m;i++){
if(u[i]!=v[i]){
if(u[i]>v[i]) return false;
return true;
}
}
return true;
} string judge(string ss,int x,int k){
// printf("k=%d\n",k);
string ans;ans.clear();
int cnt=,mark=-,sum=k;
for(int i=;i<m;i++){
ans+=a[x][i];
if(a[x][i]!=ss[i]) cnt++;
}
if(k==){
if(Min(ss,ans)==) return unite;
return ans;
} if(cnt<=k) return ss;
for(int i=;i<m;i++){
if(a[x][i]!=ss[i]){
if(k) {
k--;
ans[i]=ss[i];
if(k==) mark=i;
}
}
}
// printf("mark=%d\n",mark);
if(Min(ss,ans)) return ans;
for(int i=mark;i>=;i--){
if(ans[i]!=''){
ans[i]++;
int flag=,num=;
for(int j=i+;j<m;j++) ans[j]=a[x][j];
for(int j=;j<m;j++){
if(ans[j]!=a[x][j]) num++;
}
num=sum-num;
for(int j=i+;j<m&&num;j++){
if(ans[j]-''){
ans[j]='';
num--;
}
}
return ans;
}
}
return unite;
}
//43435
// void init(){
unite.clear();
for(int i=;i<=m;i++) unite+='a';
} int main(){
scanf("%d%d",&n,&m);init();
for(int i=;i<=n;i++){
scanf("%s",a[i]);
}
int len=;
for(int i=;i<=n;i++){
for(int j=;j<=len;j++){
dp[i][j]=unite;
}
}
// printf("len=%d\n",len);
for(int i=;i<=len;i++) dp[][i]=judge(i);
for(int i=;i<n;i++){
for(int j=;j<=len;j++){
for(int k=;k+j<=len;k++){
string tmp=judge(dp[i][j],i+,k);
// printf("i=%d j=%d k=%d\n",i,j,k);
// cout<<dp[i][j]<<endl;
// cout<<tmp<<endl;
if(Min(dp[i+][j+k],tmp)==){
// printf("i=%d j=%d k=%d\n",i,j,k);
// cout<<dp[i][j]<<endl;
// cout<<dp[i+1][j+k]<<endl;
// cout<<tmp<<endl;
dp[i+][j+k]=tmp;
pre[i+][j+k]=j;
// printf("pre[%d][%d]=%d\n",i+1,j+k,j);
}
}
}
}
//printf("www\n");
int mark=;
for(int i=;i<=len;i++){
// printf("i=%d ",i);
// cout<<dp[n][i]<<endl;
if(Min(unite,dp[n][i])==){
mark=i;
break;
}
}
// printf("%d\n",mark);
for(int i=n;i>=;i--){
str[i]=dp[i][mark];
mark=pre[i][mark];
}
for(int i=;i<=n;i++) cout<<str[i]<<endl;
return ;
} /*
5 4
9999
0000
9999
0000
9999
*/

Gym 101170A Arranging Hat dp的更多相关文章

  1. NWERC2016-Problem A(Arranging Hat)

    Arranging Hat is a cushy job indeed; high impact work, absolute authority, and 364 days of holiday e ...

  2. Codeforces Gym 100231L Intervals 数位DP

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...

  3. G - Surf Gym - 100819S -逆向背包DP

    G - Surf Gym - 100819S 思路 :有点类似 逆向背包DP , 因为这些事件发生后是对后面的时间有影响. 所以,我们 进行逆向DP,具体 见代码实现. #include<bit ...

  4. Gym 102056I - Misunderstood … Missing - [DP][The 2018 ICPC Asia-East Continent Final Problem I]

    题目链接:https://codeforces.com/gym/102056/problem/I Warm sunshine, cool wind and a fine day, while the ...

  5. Gym - 101147H H. Commandos —— DP

    题目链接:http://codeforces.com/gym/101147/problem/H 题解: 单纯的三维DP.可用递推或记忆化搜索实现. 学习:开始时用记忆化搜索写,dp[]初始化为0,结果 ...

  6. 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索

    题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...

  7. Gym 101201H Paint (离散化+DP)

    题意:给定 n 个区间,让你选出一些,使得每个选出区间不交叉,并且覆盖区间最大. 析:最容易想到的先是离散化,然后最先想到的就是 O(n^2)的复杂度,dp[i] = max(dp[j] + a[i] ...

  8. Gym - 101615J Grid Coloring DP 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

    题目传送门 题目大意: 给出n*m的网格,有红蓝两种颜色,每个格子都必须被染色,当一个格子被染成蓝色后,这个格子左上方的一块都必须被染成蓝色,问最后的方案数量. 思路: 按照题目条件,如果有一个格子被 ...

  9. CF Gym 100637K Microcircuits (DP)

    题意:给你n个点,将这些点放在一个环上,问你不相交的连k条线的方案数.(没有重点) 题解:dp[i][j]表示i个点连j条线的方案数,那么新加一个点i, 情况1,i没有和之前的点相连,方案数为dp[i ...

随机推荐

  1. Volatile不保证原子性(二)

    Volatile不保证原子性 前言 通过前面对JMM的介绍,我们知道,各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的. 这就可能存在一个线程AAA修改 ...

  2. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

  3. 带你五分钟了解python的函数式编程与闭包

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:梁唐 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  4. Java匹马行天下之JavaSE核心技术——异常处理

    Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...

  5. 机器学习常见面试题—支持向量机SVM

    前言 总结了2017年找实习时,在头条.腾讯.小米.搜狐.阿里等公司常见的机器学习面试题. 支持向量机SVM 关于min和max交换位置满足的 d* <= p* 的条件并不是KKT条件 Ans: ...

  6. vue2.x学习笔记(二十二)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12633051.html. 自定义指令 简介 除了核心功能默认内置的指令([v-mode]和[v-show]等),v ...

  7. radio取值

    假设代码如下: 1) <input type="radio"   name="radio"   id="radio1"  checke ...

  8. s3fs-fuse 把 s3-like 对象存储挂载到本地

    s3fs-fuse 是一个采用 c++

  9. 页面性能分析-Chrome Dev Tools

    一.分析面板介绍 进行页面性能快速分析的主要是图中圈出来的几个模块功能: Network : 页面中各种资源请求的情况,这里能看到资源的名称.状态.使用的协议(http1/http2/quic...) ...

  10. Python软件定时器APScheduler使用【软件定时器,非操作系统定时器,软件可控的定时器】【用途:定时同步数据库和缓存等】【刘新宇】

    APScheduler使用 APScheduler (advanceded python scheduler)是一款Python开发的定时任务工具. 文档地址 https://apscheduler. ...