[2019.8.14 Цыси моделирования игра T1] Я не! Я не сделал! Укус ваш язык ах! (Notme) (BFS + ДП)

\ (IDA ^ * \)

Честно говоря, я начал этот вопрос продуман положительные решения, а затем написал \ (IDA ^ * \) . , ,

Но магия является то , что это \ (IDA ^ * \) даже не длина строки являются \ (\ 2500,4000) данных выполняется быстро,Но после того, как данные, посланные вниз немного я измерил только 45 баллов.

Просто постоянно оптимизировать \ (IDA ^ * \) в этом процессе, я вдруг придумал практику положительных решений,Кажется, после неудачной попытки решить первую насилие.

\ (DP \) , чтобы решить первый запрос

Рассмотрим \ (ДП \) , мы устанавливаем \ (F_ {I, J} \) указывает на то, что в настоящее время является первым в первой строке \ (I \) битов второй строки \ (J \ ) минимальное количество шагов бит.

Когда запись \ (nxt1_ {х, 0/ 1}, {nxt2_ х, 0/1} \) представляют собой две строки (Х \) \ нижняя заднее положение \ (0/1 \) , где они появляются, то мы можем получить этот сдвиг:

\ [F_ {nxt1_ {я, 0}, {nxt2_ J, 0}} = мин (F_ {nxt1_ {я, 0}, {nxt2_ J, 0}}, {F_ I, J}) \]

\ [F_ {nxt1_ {я, 1}, {nxt2_ J, 1}} = мин (F_ {nxt1_ {я, 1}, {nxt2_ J, 1}}, {F_ I, J}) \]

Это будет касаться первого спросил.

\ (BFS \) для решения второго запроса

Если мы рассмотрим \ (DP \) при записи \ (LST \) указывает положение передачи, вы можете запрограммировать выход.

Но проблема требует лексикографически наименьший, Common \ (ДП \) или \ (ДФС \) в виде \ (ДП \) не удовлетворяет этому условию.

Таким образом , мы можем думать о \ (BFS \) .

Согласно (BFS \) \ быть порядок \ (DP \) , мы можем гарантировать минимальные условия лексически неизбежно удовлетворили.

код

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 4000
using namespace std;
int n,m;string s1,s2;
class DpSolver//BFS+DP
{
    private:
        string ans;short qx[(N+2)*(N+2)+5],qy[(N+2)*(N+2)+5],nxt1[N+5][2],nxt2[N+5][2];
        short f[N+5][N+5],gx[N+5][N+5],gy[N+5][N+5];bool glst[N+5][N+5];
    public:
        I void Solve()
        {
            RI i,j,x,y,H=1,T=0,p[2];s1="%"+s1,s2="%"+s2;
            for(p[0]=p[1]=n+1,i=n+1;~i;--i) nxt1[i][0]=p[0],nxt1[i][1]=p[1],p[s1[i]&1]=i;//初始化nxt1
            for(p[0]=p[1]=m+1,i=m+1;~i;--i) nxt2[i][0]=p[0],nxt2[i][1]=p[1],p[s2[i]&1]=i;//初始化nxt2
            for(i=0;i<=n+1;++i) for(j=0;j<=m+1;++j) f[i][j]=m+1;f[0][0]=0,qx[++T]=0,qy[T]=0;//初始化f数组和BFS队列
            W(H<=T) i=qx[H],j=qy[H++],//取出队首
                f[x=nxt1[i][0]][y=nxt2[j][0]]==m+1&&(qx[++T]=x,qy[T]=y),//未访问过就入队
                f[i][j]+1<f[x][y]&&(f[x][y]=f[i][j]+1,gx[x][y]=i,gy[x][y]=j,glst[x][y]=0),//更新f和g
                f[x=nxt1[i][1]][y=nxt2[j][1]]==m+1&&(qx[++T]=x,qy[T]=y),//未访问过就入队
                f[i][j]+1<f[x][y]&&(f[x][y]=f[i][j]+1,gx[x][y]=i,gy[x][y]=j,glst[x][y]=1);//更新f和g
            x=n+1,y=m+1;W(x||y) ans=(char)(glst[x][y]+48)+ans,i=gx[x][y],j=gy[x][y],x=i,y=j;//倒着找答案
            cout<<ans<<endl;//输出答案
        }
}D;
int main()
{
    freopen("notme.in","r",stdin),freopen("notme.out","w",stdout);
    cin>>s1>>s2,s1.length()>s2.length()&&(swap(s1,s2),0),n=s1.length(),m=s2.length();
    return D.Solve(),0;
}

рекомендация

отwww.cnblogs.com/chenxiaoran666/p/Contest20190814T1.html