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