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. 通过STC15F2K60S2控制SIM900A发中英文短信,打电话

    本文通过串口通信,使用STC15系列单片机实现发短信打电话功能. 一. 注意事项 1. 首先要确定手机卡已经注册到网络,具备打电话发短信功能 2. 正确的硬件连接: P3.0-----STXD或者5V ...

  2. 数据结构和算法(Golang实现)(28)查找算法-AVL树

    AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树. 一.AVL树介绍 AVL树是一棵严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和La ...

  3. 010-字符串-C语言笔记

    010-字符串-C语言笔记 学习目标 1.[掌握]二维数组的声明和初始化 2.[掌握]遍历二维数组 3.[掌握]二维数组在内存中的存储 4.[掌握]二维数组与函数 5.[掌握]字符串 一.二维数组的声 ...

  4. windows编译动态链接库,dll+lib的形式

    之前一直在linux上做开发,没怎么关注过windows上如何编译动态链接库.不过一直存疑,为什么windows上的动态链接库是.dll配合.lib使用的,这个又是怎么生成的呢,通过一段时间的查资料和 ...

  5. Windows环境下搭建Cocos2d-x3.2环境并配置android交叉编译环境

    一.软件 1)VS2012(C++11特性在VS2012以上可以使用):传送门: 2)Cocos2d-x官网源码:传送门:http://cocos2d-x.org/download 3)JDK:传送门 ...

  6. Python的6种方式实现单例模式

    单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指向同一个内存地址,仅仅只有一个实例(只有一个对象). 实现单例模式的手段有很多种,但总的原则是保证一个类只要实例化一个 ...

  7. Go gRPC进阶-proto数据验证(九)

    前言 上篇介绍了go-grpc-middleware的grpc_zap.grpc_auth和grpc_recovery使用,本篇将介绍grpc_validator,它可以对gRPC数据的输入和输出进行 ...

  8. Springboot:员工管理之删除员工及退出登录(十(9))

    springboot2.2.6 delete请求报错,降至2.1.11功能可用 原因未知 构建员工删除请求 com\springboot\controller\EmployeeController.j ...

  9. MySQL笔记总结-其他

    数据库相关概念 一.数据库的好处 1.可以持久化数据到本地 2.结构化查询 二.数据库的常见概念 ★ 1.DB:数据库,存储数据的容器 2.DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于 ...

  10. MySQL不香吗,为什么还要有noSQL?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是分布式专题的第14篇文章,我们一起来看看NoSQL数据库. 其实我很早就想写写分布式数据库相关的文章,既是我现在正在学习的,也是我很感 ...