UVA 10564 – Paths through the Hourglass (dp)

來源:互聯網
上載者:User

本文出自   http://blog.csdn.net/shuangde800

題目傳送門
題意:給一個相上面的圖。要求從第一層走到最下面一層,只能往左下或右下走,經過的數字之和為sum。問有多少條路徑之和剛好等於S? 如果有的話,輸出字典序最小的路徑。 思路:f[i][j][k] 代表從(i,j)點往下走到最後一層和為k的方案數
那麼,顯然可以得到狀態轉移:
f[i][j][k] = f[i+1][left][k-val] + f[i+1][right][k-val],  val=(i,j)格上的數字,left是往坐下走的座標,right往右下走的座標 代碼:
/**========================================== *   This is a solution for ACM/ICPC problem * *   @author: shuangde *   @blog: blog.csdn.net/shuangde800 *   @email: zengshuangde@gmail.com *===========================================*/#include<iostream>#include<cstdio>#include<algorithm>#include<vector>#include<queue>#include<cmath>#include<cstring>using namespace std;typedef long long int64;const int INF = 0x3f3f3f3f;const double PI  = acos(-1.0);int n, s;int hourGlass[50][22];int64 f[50][22][510];void input(){    for(int i=1; i<=n; ++i)        for(int j=1; j<=n-i+1; ++j)             scanf("%d", &hourGlass[i][j]);    for(int i=n+1; i<=2*n-1; ++i)        for(int j=1; j<=i+1-n; ++j)            scanf("%d", &hourGlass[i][j]); }void print_path(int i, int j, int sum){    if(i >= 2*n-1) return;    int val = hourGlass[i][j];    if(i<n){         if(j>1 && f[i+1][j-1][sum-val]){            printf("L");            print_path(i+1, j-1, sum-val);            return ;        }         printf("R");        print_path(i+1, j, sum-val);    }else{        if(f[i+1][j][sum-val]){            printf("L");             print_path(i+1, j, sum-val);            return;        }         printf("R");         print_path(i+1, j+1, sum-val);    }}int main(){    while(~scanf("%d%d", &n, &s) && n+s){        input();        memset(f, 0, sizeof(f));        // 初始化最下面一行        for(int i=1; i<=n; ++i)            f[2*n-1][i][hourGlass[2*n-1][i]] = 1;        // 下半部分dp        for(int i=2*n-2; i>=n; --i){            for(int j=1; j<=i+1-n; ++j){                for(int v=hourGlass[i][j]; v<=s; ++v){                    int w = hourGlass[i][j];                    f[i][j][v] = f[i+1][j][v-w] + f[i+1][j+1][v-w];                 }            }         }        // 上半部分dp        int64 ans = 0;        for(int i=n-1; i>=1; --i){            for(int j=1; j<=n-i+1; ++j){                for(int v=hourGlass[i][j]; v<=s; ++v){                    int w = hourGlass[i][j];                    if(j>1) f[i][j][v] += f[i+1][j-1][v-w];                    if(j<n-i+1) f[i][j][v] += f[i+1][j][v-w];                }                if(i==1) ans += f[1][j][s];            }         }        cout << ans << endl;        for(int i=1; i<=n; ++i){            if(f[1][i][s]){                printf("%d ", i-1);                 print_path(1, i, s);                break;            }        }        puts("");    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.