2018.10.21 codeforces1071B. Minimum path(dp+贪心+bfs)
传送门
唉考试的时候写错了两个细节调了一个多小时根本没调出来。
下来又调了半个小时才过。
其实很简单。
我们先dpdpdp出最开始最多多少个连续的aaa.
然后对于没法继续连续下去的用贪心+bfsbfsbfs来弄就行了。
技不如人,告辞。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,mx[2005][2005],maxA;
char mp[2005][2005];
bool vis[2005][2005];
queue<pair<int,int> >q,s;
inline void dfs(int x,int y,int dep){
if(~mx[x][y])return;
if(x==1&&y==1)mx[x][y]=(mp[x][y]=='a');
else{
if(x^1)dfs(x-1,y,dep-1);
if(y^1)dfs(x,y-1,dep-1);
mx[x][y]=(mp[x][y]=='a')+max(mx[x-1][y],mx[x][y-1]);
}
if(dep<maxA)return;
if(mx[x][y]>=dep-k){
if(dep==maxA)q.push(make_pair(x,y));
else if(dep>maxA){
while(!q.empty())q.pop();
q.push(make_pair(x,y)),maxA=dep;
}
}
}
int main(){
memset(mx,-1,sizeof(mx)),scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)scanf("%s",mp[i]+1);
maxA=k;
dfs(n,n,n*2-1);
int sig=26;
string tmp;
for(int i=1;i<=min(maxA,n*2-1);++i)tmp=tmp+'a';
if(maxA>=n*2-1)return cout<<tmp,0;
if(!maxA)q.push(make_pair(1,1)),tmp=tmp+mp[1][1];
for(int i=maxA?maxA+1:2;i<=n*2-1;++i){
sig=26;
while(!q.empty()){
pair<int,int>t=q.front();
q.pop();
int x=t.first,y=t.second,i,j;
i=x+1,j=y;
if(i<=n&&!vis[i][j]){
vis[i][j]=1;
if(mp[i][j]-'a'==sig)s.push(make_pair(i,j));
else if(mp[i][j]-'a'<sig){
while(!s.empty())s.pop();
s.push(make_pair(i,j)),sig=mp[i][j]-'a';
}
}
i=x,j=y+1;
if(j<=n&&!vis[i][j]){
vis[i][j]=1;
if(mp[i][j]-'a'==sig)s.push(make_pair(i,j));
else if(mp[i][j]-'a'<sig){
while(!s.empty())s.pop();
s.push(make_pair(i,j)),sig=mp[i][j]-'a';
}
}
}
tmp=tmp+(char)(sig+'a');
while(!s.empty())q.push(s.front()),s.pop();
}
cout<<tmp;
return 0;
}
2018.10.21 codeforces1071B. Minimum path(dp+贪心+bfs)的更多相关文章
- 2018.10.21 codeforces1071A. Cram Time(贪心构造)
传送门 直接先看最多能够凑出几个. 然后可以得到一个结论就是如果保证所有页数之和是小于等于A+BA+BA+B的一定都对应着一种合法方案. 如何构造? 我们对于第一天的AAA个小时,从大向小选,如果当前 ...
- POI 2018.10.21
[POI2008]TRO-Triangles https://www.cnblogs.com/GXZlegend/p/7509699.html 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积 ...
- 2018.10.19浪在ACM 集训队第一次测试赛
2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...
- 【2018.10.20】CXM笔记(思维)
1. 给你个环状字符串,问从哪个地方拆开能使它的字典序最小. 先预处理任意子串的哈希值. 然后枚举拆点,将它与当前最优的拆点比较谁更优(就是从哪拆的字典序更小),具体方法是二分+哈希找出两串最长的相同 ...
- [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )
Unique Paths https://oj.leetcode.com/problems/unique-paths/ A robot is located at the top-left corne ...
- Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)
Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...
- 退役前的记录(2018.10.14-NOIP2018)
退役前的记录 诸位好,我是\(CJ\)最菜的\(Oier\),已经是\(G2\)的老年选手了,不知道什么时候就会退役了,总之\(G1\ double\)的机会已经没有了,去年因为联赛失利而止步,而今年 ...
- 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)
i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...
- 刷题64. Minimum Path Sum
一.题目说明 题目64. Minimum Path Sum,给一个m*n矩阵,每个元素的值非负,计算从左上角到右下角的最小路径和.难度是Medium! 二.我的解答 乍一看,这个是计算最短路径的,迪杰 ...
随机推荐
- Angular5 UI post 请求 输出 文件下载
this.httpClient.post(url1, JSON.parse(data1) , {responseType: 'blob'}).subscribe(data => { const ...
- leetcode292
public class Solution { public bool CanWinNim(int n) { //如果要赢,最后3个必须是自己来拿 //也就是最后剩1,2,3是胜利, //如果剩4枚, ...
- 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
一.消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,RabbitM ...
- webserive学习记录4-获取天气的例子
学习到了如何创建使用webservice服务,下面就实际应用一下,从网络上获取天气数据. 先从网络上找到免费的webservice服务, 如这个网站:http://www.webxml.com.cn/ ...
- 内核线程和用户线程(SMP)
用户级和内核级线程 用户级线程:任何应用程序都可以通过使用线程库设计成多线程程序.线程库是用于用户级线程管理的一个例程句,它包含用于创建和销毁线程的代码.在线程间传递消息和数据的代码.调度线程执行的代 ...
- Python itertools/内置函数
https://docs.python.org/3.5/library/itertools.html#itertools.starmap // https://docs.python.org/3.5/ ...
- exception keynote
[exception keynote] Note that the parentheses around this tuple are required, because except ValueEr ...
- CentOS7.0重置Root的密码 (忘记密码)
首先进入开启菜单,按下e键进入编辑现有的内核,如下图所示 然后滚动列表,找到ro,将它替换成rw,并加上init=/sysroot/bin/sh,最终变为如下图 然后按CTRL+X进入到单用户模式,在 ...
- 合并区间 · Merge Intervals & 插入区间 · Insert Interval
[抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...
- [leetcode]367. Valid Perfect Square验证完全平方数
Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...