luogu P1004 方格取数

Posted Nico&11101001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P1004 方格取数相关的知识,希望对你有一定的参考价值。

题目描述

设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放

人数字0。如下图所示(见样例):

A
 0  0  0  0  0  0  0  0
 0  0 13  0  0  6  0  0
 0  0  0  0  7  0  0  0
 0  0  0 14  0  0  0  0
 0 21  0  0  0  4  0  0
 0  0 15  0  0  0  0  0
 0 14  0  0  0  0  0  0
 0  0  0  0  0  0  0  0
.                       B

某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B

点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

输入输出格式

输入格式:

输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个

表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

输出格式:

只需输出一个整数,表示2条路径上取得的最大的和。

输入输出样例

输入样例#1:
8
2 3 13
2 6  6
3 5  7
4 4 14
5 2 21
5 6  4
6 3 15
7 2 14
0 0  0
输出样例#1:
67

说明

NOIP 2000 提高组第四题

暴力出奇迹,

枚举两个点dfs对图进行爆破

 1 #include<algorithm>
 2 using namespace std;
 3 #include<cstring>
 4 #include<vector>
 5 #include<cstdio>
 6 int n,i=0,ans=0;
 7 struct P {
 8     int x,y;
 9     int t;
10 } p[128];
11 bool used[128]= {0};        //这点访问过?
12 vector<int> v[128];
13 //判断a点能不能到达b
14 bool judge(int a,int b) 
15 {
16     if(a!=b&&p[b].x>=p[a].x&&p[b].y>=p[a].y) return 1;
17     return 0;
18 }
19 void dfs(int a,int b,int s) 
20 {
21     for(int j=0; j<v[a].size(); j++) 
22     {
23         if(!used[v[a][j]]) 
24         {
25             used[v[a][j]]=1;
26             dfs(v[a][j],b,s+p[v[a][j]].t);
27             used[v[a][j]]=0;
28         }
29     }
30     for(int j=0; j<v[b].size(); j++) 
31     {
32         if(!used[v[b][j]]) 
33         {
34             used[v[b][j]]=1;
35             dfs(a,v[b][j],s+p[v[b][j]].t);
36             used[v[b][j]]=0;
37         }
38     }
39     ans=max(ans,s);
40 }
41 int main() {
42     scanf("%d",&n);
43     while(1) {
44         scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].t);
45         if(p[i].x==0&&p[i].y==0&&p[i].t==0) break;
46         i++;
47     }
48     //建立邻接表
49     for(int a=0; a<i; a++) 
50     {
51         for(int b=0; b<i; b++) 
52         {
53             if(judge(a,b)) v[a].push_back(b);
54         }
55     }
56     //枚举两个起点
57     for(int a=0; a<i-1; a++) 
58     {
59         for(int b=a+1; b<i; b++) 
60         {
61             used[a]=1;used[b]=1;
62             dfs(a,b,p[a].t+p[b].t);
63             used[a]=0;used[b]=0;
64         }
65     }
66     printf("%d",ans);
67     return 0;
68 }

 

以上是关于luogu P1004 方格取数的主要内容,如果未能解决你的问题,请参考以下文章

[luogu p1004] 方格取数

洛谷P1004方格取数

洛谷 P1004 方格取数 多线程DP/四维DP/

P1004 方格取数

P1004 方格取数

P1004 方格取数