挖地雷问题
(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;
}