uva10564

路径条数很好找。记录最小路径,就记录到各点的最小字符串,存储起来。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-8;
typedef long long lon;
const lon SZ=60,INF=0x7FFFFFFF,mod=1000000007;
lon n,k,arr[SZ][SZ],dp[SZ][SZ][510];
string str[SZ][SZ][500];

void init()
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=2*n-1;++i)
    {
        for(lon j=1;j<=abs(n-i)+1;++j)
        {
            cin>>arr[i][j];
        }
    }
    for(lon j=0;j<SZ;++j)
    {
        if(j&1)dp[0][j][0]=1;
    }
}

string toStr(lon x)
{
    if(x==0)return "0";
    string res="";
    for(;x;)
    {
        res+='0'+x%10;
        x/=10;
    }
    reverse(res.begin(),res.end());
    return res;
}

bool cmp(const string &x,const string &y)
{
    int pos1=x.find(" ");
    int pos2=y.find(" ");
    if(pos1!=pos2)return pos1<pos2;
    else return x<y;
}

void work()
{
    for(lon i=1;i<=2*n-1;++i)
    {
        for(lon j=1;j<=abs(n-i)+1;++j)
        {
            lon cur=arr[i][j];
            for(lon p=arr[i][j];p<=k;++p)
            {
                if(i<=n)
                {
                    dp[i][j][p]+=dp[i-1][j][p-cur];
                    dp[i][j][p]+=dp[i-1][j+1][p-cur];
                    if(i==1)
                    {
                        str[i][j][p]=toStr(j-1)+" ";
                    }
                    else if(dp[i-1][j][p-cur]&&dp[i-1][j+1][p-cur])
                    {
                        if(cmp(str[i-1][j][p-cur],str[i-1][j+1][p-cur]))
                        {
                            str[i][j][p]=str[i-1][j][p-cur]+"R";
                        }
                        else
                        {
                            str[i][j][p]=str[i-1][j+1][p-cur]+"L";
                        }
                    }
                    else if(dp[i-1][j][p-cur])
                    {
                        str[i][j][p]=str[i-1][j][p-cur]+"R";
                    }
                    else if(dp[i-1][j+1][p-cur])
                    {
                        str[i][j][p]=str[i-1][j+1][p-cur]+"L";
                    }
                }
                else
                {
                    dp[i][j][p]+=dp[i-1][j-1][p-cur];
                    dp[i][j][p]+=dp[i-1][j][p-cur];
                    if(i==1)
                    {
                        str[i][j][p]=toStr(j-1)+" ";
                    }
                    else if(dp[i-1][j-1][p-cur]&&dp[i-1][j][p-cur])
                    {
                        if(cmp(str[i-1][j-1][p-cur],str[i-1][j][p-cur]))
                        {
                            str[i][j][p]=str[i-1][j-1][p-cur]+"R";
                        }
                        else
                        {
                            str[i][j][p]=str[i-1][j][p-cur]+"L";
                        }
                    }
                    else if(dp[i-1][j-1][p-cur])
                    {
                        str[i][j][p]=str[i-1][j-1][p-cur]+"R";
                    }
                    else if(dp[i-1][j][p-cur])
                    {
                        str[i][j][p]=str[i-1][j][p-cur]+"L";
                    }
                }
            }
        }
    }
    lon res=0;
    char tmp=(char)('9'+1);
    string minstr="~~~~~~ ";
    for(lon j=1;j<=n;++j)
    {
        res+=dp[2*n-1][j][k];
        if(dp[2*n-1][j][k])
        {
            //cout<<" "<<str[2*n-1][j][k]<<" "<<(str[2*n-1][j][k]=="")<<endl;
            minstr=min(minstr,str[2*n-1][j][k],cmp);
        }
    }
    cout<<res<<endl;
    if(res)cout<<minstr<<endl;
    else cout<<endl;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //cout<<casenum<<endl;
    //for(lon time=1;time<=casenum;++time)
    for(lon time=1;cin>>n>>k,n;++time)
    {
        init();
        work();
    }
    return 0;
}

 

posted @ 2018-11-02 19:34  degvx  阅读(221)  评论(0)    收藏  举报