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; }
浙公网安备 33010602011771号