提交结果RE,可能空间不够或有点小bug,不过思路没错,样例结果正确,懒得调了
用的dp, 设d[i][j][s]表示到第i行第j列(从1开始)和为s的路径个数,有
d[i][j][s] = d[i-1][j][s-data[i][j]]+d[i-1][j-1 or j+1][s-data[i][j]];
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int d[24][24][500];
int data[100][100];
int N,S,ans;
void input()
{
int i,j;
int temp[24];
memset(d,0,sizeof(d));
memset(data,0,sizeof(data));
for(i=1; i<=2*N-1; i++)
for(j=1; j<= ((i<=N)?(N-i+1):(i-N+1)); j++)
scanf("%d", &data[i][j]);
for(i=1; i<N; i++)//颠倒沙漏,方便输出路径
{
memcpy(temp,data[i], sizeof(temp));
memcpy(data[i],data[2*N-i], sizeof(temp));
memcpy(data[2*N-i], temp, sizeof(temp));
}
}
void solve()
{
int i,j,s;
for(i=1; i<=N; i++)
d[1][i][data[1][i]] = 1;
for(i=2; i<=2*N-1; i++)
for(j=1; j<= ((i<=N)?(N-i+1):(i-N+1)); j++)
for(s=0; s<=S; s++)
{
if(s>=data[i][j])
{
if(i<=N)
{
d[i][j][s] = d[i-1][j][s-data[i][j]] + d[i-1][j+1][s-data[i][j]];
}
else
{
d[i][j][s] = d[i-1][j-1][s-data[i][j]] + d[i-1][j][s-data[i][j]];
}
}
}
ans=0;
for(i=1; i<=N; i++)
ans += d[2*N-1][i][S];
}
void output(int lvl,int col,int s)
{
static int ok=0;
if(lvl==1) return;
if(lvl>N)
{
if(d[lvl-1][col-1][s-data[lvl][col]]!=0)
{
printf("L");
output(lvl-1, col-1, s-data[lvl][col]);
}
else
{
printf("R");
output(lvl-1, col, s-data[lvl][col]);
}
}
else
{
if(d[lvl-1][col][s-data[lvl][col]]!=0)
{
printf("L");
output(lvl-1, col, s-data[lvl][col]);
}
else
{
printf("R");
output(lvl-1, col+1, s-data[lvl][col]);
}
}
}
int main()
{
int i;
while(scanf("%d %d",&N,&S)==2)
{
if(N==0) break;
input();
solve();
printf("%d\n",ans);
if(ans==0) printf("\n");
else
{
for(i=1; i<=N; i++)
if(d[2*N-1][i][S]!=0)
{
printf("%d ", i);
break;
}
output(2*N-1,i,S);
printf("\n");
}
}
return 0;
}