c_cpp UVa 10564 - 通过沙漏的路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp UVa 10564 - 通过沙漏的路径相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=1e5+5;
const int MAXM=1e5+5;
const int mod=1e9+7;
int n,m,x[70][50];
LL dp[70][50][600];
int MX(int a){
if (a<=n) return n-a+1;
else return a-n+1;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
if (n==0 && m==0) break;
memset(dp,0,sizeof(dp));
memset(x,0,sizeof(x));
for(int i=1;i<=2*n-1;i++){
for(int j=1;j<=MX(i);j++)
scanf("%d",&x[2*n-i][j]);
}
for(int i=1;i<=n;i++) dp[1][i][x[1][i]]=1;
for(int i=2;i<=2*n-1;i++){
for(int j=1;j<=MX(i);j++)
for(int k=x[i][j];k<=m;k++){
dp[i][j][k]+=dp[i-1][j][k-x[i][j]];
if (i<=n) dp[i][j][k]+=dp[i-1][j+1][k-x[i][j]];
if (i>n && j>1) dp[i][j][k]+=dp[i-1][j-1][k-x[i][j]];
}
}
LL ans=0;
for(int i=1;i<=n;i++) ans+=dp[2*n-1][i][m];
printf("%lld\n",ans);
for(int i=1;i<=n;i++){
int pos;
if (dp[2*n-1][i][m]!=0){
printf("%d ",i-1);
pos=i;
}
else continue;
for(int i=2*n-1;i>1;i--){
m-=x[i][pos];
if (i>n){
if (pos>1 && dp[i-1][pos-1][m]!=0) printf("L"),pos--;
else printf("R");
}
else{
if (dp[i-1][pos][m]!=0) printf("L");
else printf("R"),pos++;
}
}
break;
}
puts("");
}
return 0;
}
以上是关于c_cpp UVa 10564 - 通过沙漏的路径的主要内容,如果未能解决你的问题,请参考以下文章
UVA 10564 Paths through the Hourglass[DP 打印]
动态规划
uva-10564-dp
UVA 10564Paths through the Hourglass
c_cpp uva10189
c_cpp uva10093