zoukankan      html  css  js  c++  java
  • UVA 10564 Paths through the Hourglass

    UVA_10564

        我们可以用f[i][j][k]表示到第i行第j个格子时路径上值得和是否可以为k,为了保证记录的路径字典序最小的,我们可以将i由大向小循环。

        状态转移的思路还是很好想的,但是写起来有些蛋疼。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 50
    #define MAXS 520
    int N, S, f[MAXD][MAXD][MAXS], p[MAXD][MAXD][MAXS], num[MAXD], a[MAXD][MAXD];
    long long int d[MAXD][MAXD][MAXS];
    int init()
    {
    int i, j, k;
    scanf("%d%d", &N, &S);
    if(!N && !S)
    return 0;
    for(i = 0; i < N; i ++)
    for(j = 0; j < N - i; j ++)
    {
    scanf("%d", &a[i][j]);
    num[i] = N - i;
    }
    for(; i < 2 * N - 1; i ++)
    for(j = 0; j < i - N + 2; j ++)
    {
    scanf("%d", &a[i][j]);
    num[i] = i - N + 2;
    }
    return 1;
    }
    void printpath(int k)
    {
    int i, j, t;
    printf("%d ", k);
    for(i = 0, j = k, t = S; i < N - 1; i ++)
    {
    if(p[i][j][t] == 0)
    {
    printf("L");
    t -= a[i][j --];
    }
    else
    {
    printf("R");
    t -= a[i][j];
    }
    }
    for(; i < 2 * N - 2; i ++)
    {
    if(p[i][j][t] == 0)
    {
    printf("L");
    t -= a[i][j];
    }
    else
    {
    printf("R");
    t -= a[i][j ++];
    }
    }
    }
    void solve()
    {
    int i, j, k;
    long long int res;
    memset(p, -1, sizeof(p));
    memset(f, 0, sizeof(f));
    memset(d, 0, sizeof(d));
    for(i = 2 * N - 2, j = 0; j < num[i]; j ++)
    {
    f[i][j][a[i][j]] = 1;
    d[i][j][a[i][j]] = 1;
    }
    for(i = 2 * N - 3; i >= N - 1; i --)
    for(j = 0; j < num[i]; j ++)
    {
    for(k = 0; k <= S; k ++)
    if(f[i + 1][j][k])
    {
    f[i][j][k + a[i][j]] = 1;
    d[i][j][k + a[i][j]] += d[i + 1][j][k];
    p[i][j][k + a[i][j]] = 0;
    }
    for(k = 0; k <= S; k ++)
    if(f[i + 1][j + 1][k])
    {
    d[i][j][k + a[i][j]] += d[i + 1][j + 1][k];
    if(!f[i][j][k + a[i][j]])
    {
    f[i][j][k + a[i][j]] = 1;
    p[i][j][k + a[i][j]] = 1;
    }
    }
    }
    for(i = N - 2; i >= 0; i --)
    for(j = 0; j < num[i]; j ++)
    {
    if(j)
    for(k = 0; k <= S; k ++)
    if(f[i + 1][j - 1][k])
    {
    f[i][j][k + a[i][j]] = 1;
    d[i][j][k + a[i][j]] += d[i + 1][j - 1][k];
    p[i][j][k + a[i][j]] = 0;
    }
    if(j < num[i + 1])
    for(k = 0; k <= S; k ++)
    if(f[i + 1][j][k])
    {
    d[i][j][k + a[i][j]] += d[i + 1][j][k];
    if(!f[i][j][k + a[i][j]])
    {
    f[i][j][k + a[i][j]] = 1;
    p[i][j][k + a[i][j]] = 1;
    }
    }
    }
    res = 0;
    for(i = 0; i < num[0]; i ++)
    if(f[0][i][S])
    {
    if(!res)
    k = i;
    res += d[0][i][S];
    }
    printf("%lld\n", res);
    if(res)
    printpath(k);
    printf("\n");
    }
    int main()
    {
    while(init())
    solve();
    return 0;
    }


  • 相关阅读:
    [转载]#2002 服务器没有响应 (或者本地 MySQL 服务器的套接字没有正确配置
    [转载]使用Cufon技术实现Web自定义字体
    [转载]Fedora14下MySQL、Apache、PHP、phpMyAdmin的安装步聚
    GUID的使用
    访问来源记录
    MongoDB数据库的基本概念
    域登录验证
    sql语法和MongoDB语法的对应关系
    ADO.NET数据集添加虚拟字段
    MongoDB开发常用资源地址
  • 原文地址:https://www.cnblogs.com/staginner/p/2275595.html
Copyright © 2011-2022 走看看