洛谷-【动态规划】-P2196 挖地雷

题目背景

NOIp1996提高组第三题

题目描述

在一个地图上有NN个地窖(N \le 20)(N≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入输出格式

输入格式:

有若干行。

第11行只有一个数字,表示地窖的个数NN。

第22行有NN个数,分别表示每个地窖中的地雷个数。

第33行至第N+1N+1行表示地窖之间的连接情况:

第33行有n-1n−1个数(00或11),表示第一个地窖至第22个、第33个、…、第nn个地窖有否路径连接。如第33行为1 1 0 0 0 … 011000…0,则表示第11个地窖至第22个地窖有路径,至第33个地窖有路径,至第44个地窖、第55个、…、第nn个地窖没有路径。

第44行有n-2n−2个数,表示第二个地窖至第33个、第44个、…、第nn个地窖有否路径连接。

… …

第n+1n+1行有11个数,表示第n-1n−1个地窖至第nn个地窖有否路径连接。(为00表示没有路径,为11表示有路径)。

输出格式:

有两行

第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

第二行只有一个数,表示能挖到的最多地雷数。

输入输出样例

输入样例#1: 复制

5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1

输出样例#1: 复制

1 3 4 5
27

题解:从任意一个点出发,往下一个能够到达的点,进行搜索,不断记录能够获得的最大值,并记录走过的路径,最后递归输出路径。在这里,我们设dp[i]表示为以第i的节点为结束点的最大值,则dp[i]=max(dp[i],dp[j])+a[i].

import java.util.*;
/*
 *挖地雷
 */
public class Main{
	static int[] pre;
	public static void print(int x) {
		if(pre[x]==0) {
			System.out.print(x);
			return;
		}
		print(pre[x]);
		System.out.print(" "+x);
	}
	public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[] v=new int[n+1];
        for(int i=1;i<=n;i++) {
        	v[i]=in.nextInt();
        }
        int[][] g=new int[n+1][n+1];
        for(int i=1;i<=n;i++) {
        	for(int j=i+1;j<=n;j++) {
        		g[i][j]=in.nextInt();
        	}
        }
        int[] dp=new int[n+1];
        pre=new int[n+1];
        int res=0,t=0;
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=n;j++) {
        		if(g[j][i]==1&&dp[j]>dp[i]) {
        			dp[i]=dp[j];
        			pre[i]=j;
        		}
        	}
        	dp[i]+=v[i];
        	if(res

 

你可能感兴趣的:(洛谷,DP(动态规划),Java)