P5486 [JLOI2010]世界杯租房 题解

· · 题解

题意简述

题目分析

转移:

for(int i = t-1;i>=s;i--)
    {
        F(j,1,m)
        {
            F(k,0,m)
            {                          
                if(c[i+1][k]=='X' || c[i][j] =='X') continue;//判断该状态合法以及转移而来的状态合法
                int nw=f[i+1][k]+(j!=k);
                if(f[i][j]>nw&&k!=0)
                {
                    g[i][j]=k;//顺带转移了g数组
                }
                f[i][j]=min(f[i][j],f[i+1][k]+(j!=k));
            }
        }   

输出

这里也是有点难度(对于我来说),卡了我有一会儿

for(int i = s;i<=t;i++)
    {
        if(g[i][w]!=w)
        {
            if(w<1 || w>26) return;
            cout << char((w+'A'-1));
            cout << ": "<<nw << "-"<<i+1<<'\n';
            w=g[i][w];
            nw=i+1;
        } 
    }

其他的代码希望读者自行编写

另外,感谢某位不愿透露姓名的同学的帮助给予一些思路