zoukankan      html  css  js  c++  java
  • hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)

    题意:

    给一个m*n的矩阵,每格上有一个数。

    找从第1行到第m行的一条路径,使得这条路径上的数之和最小。

    路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个)

    输出每一行取的数的列值。  若有多个答案,则路径要求尽量靠右。

    思路:

    简单数塔DP。题比较不好读,不过可以分析样例。

    代码:

    int T,m,n;
    int a[105][105], f[105][105];
    int path[105];
    
    int main(){
        cin>>T;
        rep(t,1,T){
            scanf("%d%d",&m,&n);
            rep(i,1,m) rep(j,1,n) scanf("%d",&a[i][j]);
            mem(f,inf);
            rep(j,1,n) f[1][j]=a[1][j];
            rep(i,2,m){
                rep(j,1,n){
                    int y;
                    y=j-1; if(y>=1 && f[i-1][y]+a[i][j]<=f[i][j]) f[i][j]=f[i-1][y]+a[i][j];
                    y=j;   if(y>=1 && f[i-1][y]+a[i][j]<=f[i][j]) f[i][j]=f[i-1][y]+a[i][j];
                    y=j+1; if(y<=n && f[i-1][y]+a[i][j]<=f[i][j]) f[i][j]=f[i-1][y]+a[i][j];
                }
            }
    
            int mins=inf, minsp=-1;
            rep(i,1,n) if(f[m][i]<=mins) mins=f[m][i],minsp=i;
            path[m]=minsp;
            rep2(i,m-1,1){
                int v=path[i+1];
                int temp=inf, tempP;
                if(v+1<=n && f[i][v+1]<temp) temp=f[i][v+1],tempP=v+1;
                if(f[i][v]<temp) temp=f[i][v], tempP=v;
                if(v-1>=1 && f[i][v-1]<temp) temp=f[i][v-1],tempP=v-1;
                path[i]=tempP;
            }
            printf("Case %d
    ",t);
            rep(i,1,m-1) printf("%d ",path[i]); printf("%d
    ",path[m]);
        }
    }
  • 相关阅读:
    c#常用正则表达式
    亲密接触Discuz!NT之架构篇:优良架构 方便网站整合与二次开发
    即时对话,在线对话,QQ,MSN,UC,popo
    C#事务处理
    正则表达式中的特殊字符
    9:38 2009729
    16:43 200981 缓解疲劳的七大唱片 免费短信
    复选框 全选
    9:05 2009721
    9:34 2009728
  • 原文地址:https://www.cnblogs.com/fish7/p/4085561.html
Copyright © 2011-2022 走看看