和 数字金字塔 几乎一样
f[i[[j][s] s表示当前的和
#include<iostream> #include <cstring> #include <algorithm> using namespace std; const int N=90; #define int long long int n,S,a[N][N],f[N][N][502]; main(){ //freopen("in","r",stdin); freopen("out","w",stdout); while(cin>>n>>S,n){ memset(f,0,sizeof f); int i,j; for(i=1;i<=n;i++) for(j=1;j<=n-i+1;j++) cin>>a[i][j]; for(i=2;i<=n;i++) for(j=1;j<=i;j++) cin>>a[i+n-1][j]; for(j=1;j<=n;j++) f[2*n-1][j][a[2*n-1][j]]=1; for(i=2*n-2;i>=n;i--) for(j=1;j<=i-n+1;j++) for(int s=a[i][j];s<=S;s++) f[i][j][s]=f[i+1][j][s-a[i][j]]+f[i+1][j+1][s-a[i][j]]; for(i=n-1;i>=1;i--) for(j=1;j<=n-i+1;j++) for(int s=a[i][j];s<=S;s++){ f[i][j][s]=f[i+1][j][s-a[i][j]]+f[i+1][j-1][s-a[i][j]]; } long long ans=0; int id=0; for(i=1;i<=n;i++){ if(f[1][i][S]){ ans+=f[1][i][S]; if(id==0) id=i; } } cout<<ans<<endl; if(id==0){cout<<endl;continue;} cout<<id-1<<' '; for(i=1;i<n;i++){ S-=a[i][id]; if(f[i+1][id-1][S]) cout<<'L',id--; else cout<<'R'; } for(i=n;i<2*n-1;i++){ S-=a[i][id]; if(f[i+1][id][S]) cout<<'L'; else cout<<'R',id++; } cout<<endl; } }