挖地雷问题_DP

挖地雷问题

                      (P3.pas/c/cpp)

来源:NOIP1996(提高组)第三题(有改动)

 

【问题描述】

 

    在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。如图3

                图3

当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

 

【输入文件】

 

   N:                       (表示地窖的个数)

 

 W1,W2,W3,……WN  (表示每个地窖中埋藏的地雷数量)

 

  A12…………… .     A1N     地窖之间连接路径(其中Aij=1表示地窖i,j

 

      A23…………..   A2N       之间是否有通路:通Aij=1,不通Aij==0)

 

  

 

            ……..

 

                   AN-1 AN

 

【输出文件】

 

   K1--K2--……….KV                  (挖地雷的顺序)

 

   MAX                           (挖地雷的数量)

 

【输入样例】

 

 5

 

10,8,4,7,6

 

1 1  1  0

 

  0  0  0

 

     1  1

 

        1

 

【输出样例】

 

 1 ->3 -> 4 -> 5

 

 max=27

 

【Hint】

 

题目中的路径是有向的且无环路(这是我做的改动原题中没有要求)。

#include 
#include 

int dp[21];
int a[21][21];
int w[21];
char p[21][21];

int main()
{
       int n;

       scanf("%d",&n);

       int i,j;

       for(i=1;i<=n;i++)
       {
              scanf("%d",&w[i]);
       }
       for(i=1;i<=n-1;i++)
       {
              for(j=1;j<=i-1;j++)
              {
                    printf("  ");
              }
              for(j=i+1;j<=n;j++)
              {
                     scanf("%d",&a[i][j]);
              }
       }

       memset(dp,0,sizeof(dp));

       dp[n]=w[n];

       int max=0;

       int m=0;
       p[n][0]=n;

       for(i=n-1;i>=1;i--)
       {
              dp[i]=w[i];
              for(j=i+1;j<=n;j++)
              {
                     if(dp[i]",p[m][i]);
              else 
                printf("%d\n",p[m][i]);
                    
       }

       printf("%d\n",max);

       return0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值