Codeforces Round #517(Div.2, based on Technocup 2019 Elimination Round 2): D. Minimum path(사고)
3742 단어 사유
Consider all paths from the upper left corner to the lower right corner that move from a cell to its neighboring cell to the right or down. Each path is associated with the string that is formed by all the letters in the cells the path visits. Thus, the length of each string is 2n−1.
Find the lexicographically smallest string that can be associated with a path after changing letters in at most k cells of the matrix.
A string a is lexicographically smaller than a string b, if the first different letter in a and b is smaller in a.
Input The first line contains two integers n and k ( 1 ≤ n ≤ 2000 , 0 ≤ k ≤ n 2 ) (1≤n≤2000, 0≤k≤n^2) (1≤n≤2000,0≤k≤n2) — the size of the matrix and the number of letters you can change.
Each of the next n lines contains a string of n lowercase English letters denoting one row of the matrix.
Output Output the lexicographically smallest string that can be associated with some valid path after changing no more than k letters in the matrix.
Examples input 4 2 abcd bcde bcad bcde output aaabcde input 5 3 bwwwz hrhdh sepsp sqfaf ajbvw output aaaepfafw input 7 6 ypnxnnp pnxonpm nxanpou xnnpmud nhtdudu npmuduh pmutsnz output aaaaaaadudsnz
사고방식: k번의 수정 기회가 있고 사전의 순서를 최소화해야 하기 때문에 당연히 앞의 문자를'a'로 바꿔야 한다. 그러면 우리는 서열에서 접두사가 모두'a'로 가장 긴 길이를 구할 수 있다.
그리고 우리는 이 접두사의 마지막 문자부터 (n, n) (n, n) (n, n) (n, n) 에 도달하는 사전 순서의 가장 작은 경로를 찾아낸다. 우리는 이 점들을 한 걸음 걸어서 얻을 수 있는 문자를 찾아내고 가장 작은 문자를 찾아 답안에 넣은 다음에 이 가장 작은 문자들을 기점으로 상술한 조작을 반복한다.
#include
using namespace std;
const int MAX=2e3+10;
char s[MAX][MAX];
int v[MAX][MAX];
int d[MAX][MAX];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
memset(d,0,sizeof d);
int ma=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i>1&&j>1)d[i][j]=min(d[i-1][j],d[i][j-1]);
else if(i>1)d[i][j]=d[i-1][j];
else if(j>1)d[i][j]=d[i][j-1];
d[i][j]+=(s[i][j]!='a');
if(d[i][j]<=m)ma=max(ma,i+j-1);// 'a'
}
}
queuep,q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(d[i][j]<=m&&i+j-1==ma)//
{
p.push(i);
p.push(j);
}
}
}
string ans="";
for(int i=1;i<=ma;i++)ans+='a';
if(ma==0)
{
p.push(1);
p.push(1);
ans+=s[1][1];
ma++;
}
for(int i=ma+1;i<=2*n-1;i++)
{
q=p;
char nex='z';
while(!p.empty())
{
int x=p.front();p.pop();
int y=p.front();p.pop();
if(x+1<=n)nex=min(nex,s[x+1][y]);//
if(y+1<=n)nex=min(nex,s[x][y+1]);
}
ans+=nex;
while(!q.empty())
{
int x=q.front();q.pop();
int y=q.front();q.pop();
if(x+1<=n&&s[x+1][y]==nex&&v[x+1][y]==0)//
{
p.push(x+1);
p.push(y);
v[x+1][y]=1;
}
if(y+1<=n&&s[x][y+1]==nex&&v[x][y+1]==0)
{
p.push(x);
p.push(y+1);
v[x][y+1]=1;
}
}
}
cout<
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
codeforce 991E(조합수 반복 검색)제목 링크: 링크 열기 클릭 샤오밍이 헷갈릴 때 본 자동차 번호판 숫자를 실제 숫자와 비교해 보자. ① 실제로 나온 숫자는 샤오밍이 다 봤다 ② 샤오밍은 같은 숫자만 보고 적을 수는 없다 ③ 차량 번호는 전도 제로가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.