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 ...
随机推荐
- Linux c++ vim环境搭建系列(2)——Ubuntu18.04.4编译安装llvm clang
2. 源码编译安装llvm clang 参考网址: https://llvhttps
- 返回指定字符串位置的函数FIELD(S,S1,S2,...) 与 FIND_IN_SET(S1,S2) 函数
FIELD(S,S1,S2,...) 与 FIND_IN_SET(S,S1) 函数 ------> 这2个函数都是返回指定字符串在源串中的出现的位置(皆是第一次出现的位置),但2个函数的参数 ...
- 【python实现卷积神经网络】上采样层upSampling2D实现
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- JMF 下载安装与测试 测试成功
本来就是想在自己写的java里面加入实习的摄像头监控,然后个各种百度了一下,就用JMF来弄了,不过这个东西貌似比较旧,网上的资料虽然说有,但是也不是太多,并且遇到的一下问题也不能解决,总之经过了一天的 ...
- 修改vs默认浏览器
右键你的Html或者网页项目,选择"使用以下工具浏览" 跳出选择框,选择你想要的浏览器作为默认值即可,也可以添加你想要的浏览器.
- Daily Scrum 1/6/2015
Process: Zhaoyang: Complete the speech API test and do some UI upgrade. Yandong: Help zhaoyang to do ...
- Eight HDU - 1043 (双向BFS)
记得上人工智能课的时候老师讲过一个A*算法,计算估价函数(f[n]=h[n]+g[n])什么的,感觉不是很好理解,百度上好多都是用逆向BFS写的,我理解的逆向BFS应该是从终点状态出发,然后把每一种状 ...
- 改善 Python 程序的 91 个建议
1.引论 建议1:理解Pythonic概念—-详见Python中的<Python之禅> 建议2:编写Pythonic代码 避免不规范代码,比如只用大小写区分变量.使用容易混淆的变量名.害怕 ...
- php phpStudy session存放位置
如果你仅仅是想知道session保存的文件在哪里,你可以在你的PHP文件当中运行函数:session_save_path之后查看运行结果即可知道session文件的存放目录. 或者: 在php-ini ...
- windows server 2012 R2系统安装部署SQLserver2016企业版(转)
转自 https://blog.csdn.net/qq_35938548/article/details/80272288 安装sql server是一个很繁琐的事情,花了一下午时间倒腾,现记录下整 ...