Gym 101170A Arranging Hat dp
题目大意:
给你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&#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的更多相关文章
- NWERC2016-Problem A(Arranging Hat)
Arranging Hat is a cushy job indeed; high impact work, absolute authority, and 364 days of holiday e ...
- Codeforces Gym 100231L Intervals 数位DP
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...
- G - Surf Gym - 100819S -逆向背包DP
G - Surf Gym - 100819S 思路 :有点类似 逆向背包DP , 因为这些事件发生后是对后面的时间有影响. 所以,我们 进行逆向DP,具体 见代码实现. #include<bit ...
- 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 ...
- Gym - 101147H H. Commandos —— DP
题目链接:http://codeforces.com/gym/101147/problem/H 题解: 单纯的三维DP.可用递推或记忆化搜索实现. 学习:开始时用记忆化搜索写,dp[]初始化为0,结果 ...
- 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...
- Gym 101201H Paint (离散化+DP)
题意:给定 n 个区间,让你选出一些,使得每个选出区间不交叉,并且覆盖区间最大. 析:最容易想到的先是离散化,然后最先想到的就是 O(n^2)的复杂度,dp[i] = max(dp[j] + a[i] ...
- Gym - 101615J Grid Coloring DP 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
题目传送门 题目大意: 给出n*m的网格,有红蓝两种颜色,每个格子都必须被染色,当一个格子被染成蓝色后,这个格子左上方的一块都必须被染成蓝色,问最后的方案数量. 思路: 按照题目条件,如果有一个格子被 ...
- CF Gym 100637K Microcircuits (DP)
题意:给你n个点,将这些点放在一个环上,问你不相交的连k条线的方案数.(没有重点) 题解:dp[i][j]表示i个点连j条线的方案数,那么新加一个点i, 情况1,i没有和之前的点相连,方案数为dp[i ...
随机推荐
- 【Java】FlowControl 流程控制
FlowControl 流程控制 什么是流程控制? 控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述.子程序)运行或求值的顺序. 不论是在声明式编程语言或是函数 ...
- C - League of Leesins
乱搞一发,,竟然过了!!! 题目大意:输入一个整数n,然后n-2行,每一行3个数字,表示一个数组中连续的3个数字,然后将这3个数字的顺序打乱,然后再将这个n-2行打乱,要求还原数组. 题解:先找到前3 ...
- Co-prime 杭电4135
Given a number N, you are asked to count the number of integers between A and B inclusive which are ...
- ant-design-vue表单生成组件form-create快速上手
介绍 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组件.结合内置17种常用表单组件和自定义组件,再复杂的表单都可 ...
- CSS 中的伪类和伪元素
伪类(Pseudo classes) 由于状态的变化是非静态的,所以元素达到一个特定状态时,它可能得到一个伪类的样式:当状态改变时,它又会失去这个样式.由此可以看出,它的功能和 class 有些类似, ...
- ViewDragHelper的点击事件处理
在上一篇ViewDragHelper的介绍后,已经完成了自定义控件SwipeLayout的滑动,这一篇,我们来处理它的点击事件.之前提到过,它有两个子view,最开始显示的是surfaceLayout ...
- df卡住的解决办法
在使用网络存储时,如果网络存储出问题.比如使用NFS,网络中断,df -h会卡住 情形一 ctrl+c是能取消中断的,这种情况算是比较幸运.使用mount查看有哪些挂载点,将其卸载即可. 情形二 ct ...
- 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置
场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...
- Jquery中 $.Ajax() 参数详解
1.url:要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type:要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如pu ...
- Django编写自定义manage.py 命令
官网文档地址:编写自定义 django-admin 命令 金句: 你所浪费的今天,正是昨天死的人所期待的明天. 开篇话: python manage.py <command> 的命令我们用 ...