随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

和 数字金字塔 几乎一样

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;
    }
 }
 
 
 
 
 
复制代码

 

posted on   towboat  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示