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. java接口工厂模式理解

    作为实际java开发经验还不到一年的我,第一次写博客,诚惶诚恐,怕把自己的谬误公之于众,误人子弟,不过转念一想,若是能有同行加以指点评判,将他们的真知灼见描述出来,那这篇文章就算抛转引玉了. 最近在阅 ...

  2. MyEclipse 10安装SVN插件subclipse

    1. 下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?expandFolder=2240& ...

  3. L4文本预处理

    文本预处理 timemachine.txt数据下载地址 链接:https://pan.baidu.com/s/1RO2OLyTRQZ90HJUW7V7BCQ 提取码:bjox NLTK数据集下载 链接 ...

  4. Rescue BFS+优先队列 杭电1242

    思路 : 优先队列 每次都取最小的时间,遇到了终点直接就输出 #include<iostream> #include<queue> #include<cstring> ...

  5. ATcoder--D - Summer Vacation

    这个题目的题意有点难搞 题目连接: https://atcoder.jp/contests/abc137/tasks/abc137_d 题目大意:输入n和m 指的是一共有n个输入在m天前一共能赚到的钱 ...

  6. Flask基础-01.Flask简介

    Flask简介 Web应用程序作用 Web(World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档. 关于Web框架 1. 什么是Web框架? 1. 已经封装好了一段代码,协助程序 ...

  7. docx4j docx转html

    不好用,转完问题挺多,百度还找不到资料头疼.public static void docxToHtml(String fileUrl) throws Exception { String path = ...

  8. vue2.x学习笔记(六)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12571171.html. class与style绑定 操作元素的class列表和内联样式,是数据绑定的一个常见需求 ...

  9. 【Linux常见命令】vimdiff命令

    在类nuix平台,我们希望对文件之间的差异之间快速定位,希望能够很容易的进行文件合并……. 可以使用Vim提供的diff模式,通常称作vimdiff,就是这样一个能满足所有这些需求,甚至能够提供更多的 ...

  10. 标准库ConfigParser模块

    用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式如下: 1 2 3 4 5 6 7 8 9 10 11 12 ...