【动态规划】Vijos P1143 三取方格数

题目链接:

  https://vijos.org/p/1143

题目大意:

  NxN的矩阵,每个值只能取一次,从(1,1)走到(n,n)走三次能取得的最大值。

题目思路:

  【动态规划】

  f[x1][y1][x2][x3]表示第一次走x1,y1,相同步数下第二次走x2,y2,第三次走x3,y3的最大值。

  因为步数一样y2,y3可以直接求出来。

  

 1 //
 2 //by coolxxx
 3 //#include<bits/stdc++.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<map>
 9 #include<memory.h>
10 #include<time.h>
11 #include<stdio.h>
12 #include<stdlib.h>
13 #include<string.h>
14 //#include<stdbool.h>
15 #include<math.h>
16 #define min(a,b) ((a)<(b)?(a):(b))
17 #define max(a,b) ((a)>(b)?(a):(b))
18 #define abs(a) ((a)>0?(a):(-(a)))
19 #define lowbit(a) (a&(-a))
20 #define sqr(a) ((a)*(a))
21 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
22 #define mem(a,b) memset(a,b,sizeof(a))
23 #define eps (1e-8)
24 #define J 10
25 #define MAX 0x7f7f7f7f
26 #define PI 3.14159265358979323
27 #define N 24
28 using namespace std;
29 typedef long long LL;
30 int cas,cass;
31 int n,m,lll,ans;
32 int a[N][N];
33 int f[N][N][N][N];
34 int main()
35 {
36     #ifndef ONLINE_JUDGE
37 //    freopen("1.txt","r",stdin);
38 //    freopen("2.txt","w",stdout);
39     #endif
40     int i,j,x1,y1,x2,y2,x3,y3;
41 //    for(scanf("%d",&cas);cas;cas--)
42 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
43     while(~scanf("%d",&n))
44 //    while(~scanf("%d",&n))
45     {
46         for(i=1;i<=n;i++)
47         {
48             for(j=1;j<=n;j++)
49                 scanf("%d",&a[i][j]);
50         }
51         for(x1=1;x1<=n;x1++)
52         {
53             for(y1=1;y1<=n;y1++)
54             {
55                 for(x2=1;x2<=x1;x2++)
56                 {
57                     for(x3=1;x3<=x1;x3++)
58                     {
59                         y2=x1+y1-x2;y3=x1+y1-x3;
60                         f[x1][y1][x2][x3]=max(
61                         max(max(f[x1-1][y1][x2][x3],f[x1-1][y1][x2][x3-1]),
62                             max(f[x1-1][y1][x2-1][x3],f[x1-1][y1][x2-1][x3-1])),
63                         max(max(f[x1][y1-1][x2][x3],f[x1][y1-1][x2][x3-1]),
64                             max(f[x1][y1-1][x2-1][x3],f[x1][y1-1][x2-1][x3-1])))+a[x1][y1];
65                         if(x1!=x2 && y1!=y2)f[x1][y1][x2][x3]+=a[x2][y2];
66                         if(x1!=x2 && y1!=y2 && x1!=x3 && y1!=y3 && x2!=x3 && y2!=y3)f[x1][y1][x2][x3]+=a[x3][y3];
67                     }
68                 }
69             }
70         }
71         printf("%d\n",f[n][n][n][n]);
72     }
73     return 0;
74 }
75 /*
76 //
77
78 //
79 */

  

时间: 2025-01-13 20:45:05

【动态规划】Vijos P1143 三取方格数的相关文章

三取方格数

描述 设有N*N的方格图,我们将其中的某些方格填入正整数,而其他的方格中放入0. 某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角. 在走过的路上,他取走了方格中的数.(取走后方格中数字变为0)此人从左上角到右下角共走3次,试找出3条路径,使得取得的数总和最大. 格式 输入格式 第一行:N (4<=N<=20)接下来一个N*N的矩阵,矩阵中每个元素不超过80,不小于0 输出格式 一行,表示最大的总和. 样例1 样例输入1[复制] 4 1 2 3 4 2 1 3 4 1 2 3 4

我的DP训练计划:三取方格数

题面: 背景 JerryZhou同学经常改编习题给自己做. 这天,他又改编了一题..... 描述 设有N*N的方格图,我们将其中的某些方格填入正整数, 而其他的方格中放入0. 某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角. 在走过的路上,他取走了方格中的数.(取走后方格中数字变为0) 此人从左上角到右下角共走3次,试找出3条路径,使得取得的数总和最大. 格式 输入格式 第一行:N (4<=N<=20) 接下来一个N*N的矩阵,矩阵中每个元素不超过80,不小于0 输出格式 一行

begin.BZOJ 1383: 三取方格数

题目链接:传送门 题目大意:给你一个矩阵,每个格子有一个值,现在你要从左上角走到右下角(走3次),使得经过路径的权值和最大. 每个格子的值只能取一次,取完后变为0,输出走完三次后最大的权值和. 题目思路:费用流做法,对于每个格子拆点,因为权值只有第一次能取,所以将每个格子拆为两条边,一条边容量为1,费用为格子的权值,另一条边容量2,费用0.  相邻格子间连边,容量3,费用0.再建立源点S 与左上角第一个格子连边容量3,费用0.汇点 T 与右下角最后一个格子连边,容量3,费用0.跑费用流累加费用即

poj 3422 洛谷P2045 K取方格数(方格取数加强版)

Description: 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大 Input: 第一行两个数n,k(1<=n<=50, 0<=k<=10) 接下来n行,每行n个数,分别表示矩阵的每个格子的数 Output: 一个数,为最大和 思路:仍旧是拆点 因为每个点都有一个限制K和一个价

vijos 1563 疯狂的方格取数

P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签] 背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取方格数和vijos中的三取方格数后,突发奇想.... 描述 在一个宽M,长N的矩阵中,请你编一个程序,n次从矩阵的左上角走到矩阵的右下角,每到一处,就取走该处的数字,请你选择一种走法使取得的数字的和最大,并输出其最大值.其中:3<=M<=20 M<=N<=100 1<=n<=1

动态规划题目(三)——最大连续乘积子串

动态规划题目(三)--最大连续乘积子串 1. 题目描述 给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8.也就是说,上述数组中,3 0.5 8这3个数的乘积30.58=12是最大的,而且是连续的. 2. 动态规划求解 动态规划求解题目的时候最重要的是要找到状态转移方程! 针对这道题目,我们使用两个变量记录当前最大值maxEnd, 和当前最小值minEnd.为什么记录当前最小值呢?因为数组中会出现负数,乘以一个负数的话

VBA取行列数,运行CMD,数组,VBA写文件相关

备忘用: 1.VBA取行列数: 例如要取第二行使用了多少列:Cells(2, Columns.Count).End(xlToLeft).Column:解释:主要是End方法,VBA中如下阐述:返回一个 Range 对象,该对象代表包含源区域的区域尾端的单元格.等同于按键 End+ 向上键.End+ 向下键.End+ 向左键或 End+ 向右键.Range 对象,只读.意思就是说取到选择区域的最后一个单元格. 如果你需要取到sheet页内使用到的最大行和列,可以如下使用:    nRow = Ac

一个网站的诞生03--抓取评论数最多的一万家餐厅

在大众点评网上,有很多种方式对餐厅进行排序,比如http://www.dianping.com/search/category/1/10/o10,是上海全市按照评论总数最多对餐厅进行排序,下面有50个分页,也就是上海历年累计评论综述最多的750家餐厅.但只有750家,少了点.上海有18个区,逐区点击的话,每区都会显示前750家餐厅,比如这个http://www.dianping.com/search/category/1/10/r802o10,是浦东新区八佰伴地段的前750家.上海现在有十万家餐

addEventListener中的第三个参 数

addEventListener中的第三个参 数是useCapture, 一个bool类型.当为false时为冒泡获取(由里向外),true为为捕获 capture方式(由外向里). function addEvent(obj,sEv,fn){ if(obj.addEventListener){ obj.addEventListner(sEv,fn,false); }else{ obj.attatchEvent('on'+sEv,fn); } } <!doctype html> <htm