Codeforces Round #245 (Div. 1) B. Working out (简单DP)

题目链接:http://codeforces.com/problemset/problem/429/B

给你一个矩阵,一个人从(1, 1) ->(n, m),只能向下或者向右; 一个人从(n, 1) ->(1, m),只能向上或者向右。必须有一个相遇点, 相遇点的值不能被取到, 问两个人能得到的最大路径和是多少?

dp[i][j]:表示从一个点出发的最大值;先预处理从(1,1) (1,m) (n,1) (n,m)四个点出发的4个dp最大值。然后枚举所有的点,但是这个点不能在边缘,考虑枚举点不够,还要考虑枚举这个点的上下左右的值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 1e3 + 5;
 4 int dp1[MAXN][MAXN] , dp2[MAXN][MAXN] , dp3[MAXN][MAXN] , dp4[MAXN][MAXN];
 5 int a[MAXN][MAXN];
 6
 7 int main()
 8 {
 9     int n , m;
10     scanf("%d %d" , &n , &m);
11     for(int i = 1 ; i <= n ; ++i) {
12         for(int j = 1 ; j <= m ; ++j) {
13             scanf("%d" , &a[i][j]);
14         }
15     }
16     for(int i = 1 ; i <= n ; ++i) {
17         for(int j = 1 ; j <= m ; ++j) {
18             dp1[i][j] = max(dp1[i - 1][j] , dp1[i][j - 1]) + a[i][j];
19         }
20     }
21     for(int i = n ; i >= 1 ; --i) {
22         for(int j = 1 ; j <= m ; ++j) {
23             dp2[i][j] = max(dp2[i + 1][j] , dp2[i][j - 1]) + a[i][j];
24         }
25     }
26     for(int i = 1 ; i <= n ; ++i) {
27         for(int j = m ; j >= 1 ; --j) {
28             dp3[i][j] = max(dp3[i][j + 1] , dp3[i - 1][j]) + a[i][j];
29         }
30     }
31     for(int i = n ; i >= 1 ; --i) {
32         for(int j = m ; j >= 1 ; --j) {
33             dp4[i][j] = max(dp4[i + 1][j] , dp4[i][j + 1]) + a[i][j];
34         }
35     }
36     int res = 0;
37     for(int i = 2 ; i < n ; ++i) {
38         for(int j = 2 ; j < m ; ++j) {
39             res = max(res , dp1[i][j - 1] + dp2[i + 1][j] + dp3[i - 1][j] + dp4[i][j + 1]);
40             res = max(res , dp1[i - 1][j] + dp2[i][j - 1] + dp3[i][j + 1] + dp4[i + 1][j]);
41         }
42     }
43     printf("%d\n" , res);
44     return 0;
45 }
时间: 2024-10-12 20:23:46

Codeforces Round #245 (Div. 1) B. Working out (简单DP)的相关文章

Codeforces Round #245 (Div. 1)——Tricky Function

l and dished out an assist in the Blackhawks' 5-3 win over the Nashville Predators.Shaw said just playing with the Blackhawks was enough motivation for him."Positive, I'm playing in the NHL," Shaw said after Sunday's win. "What can't you be

Codeforces Round #245 (Div. 1)——Working out

题目链接 题意: 一个n*m的矩阵,每个方格有一个非负数,现在选择两条线路:一个左上到右下,一个左下到右上,且只能有一个公共点.求两个线路上数的最大值(公共点不算) 分析: 只有两种情况,dp即可.记两个线路为1和2,考虑一个公共点,1为左进右出,2为下进上出:1上进下出,2为左进右出 const int MAXN = 1005; int lu[MAXN][MAXN], ld[MAXN][MAXN]; int ru[MAXN][MAXN], rd[MAXN][MAXN]; int ipt[MAX

Codeforces Round #245 (Div. 1)——Xor-tree

题目链接 题意: 给一棵树n个节点,1为根节点.操作为,选定一个节点x,当前值取反,x的孙子,孙子的孙子...均取反 现在告诉初始时每个点的值和最后每个点的目标值,求操作次数最少时需要选择那些节点 (1?≤?n?≤?105) 分析: 深度浅的点一定是受影响最小的(根节点只受自己的影响),所以从根依次向下递推处理即可 const int MAXN = 110000; VI G[MAXN], ans; int now[MAXN], goal[MAXN]; void dfs(int u, int fa

Codeforces Round #245 (Div. 1)——Guess the Tree

本文出自:http://blog.csdn.net/svitter 实验环境:Myeclipse10 + tomcat7.0 有时间会写windows和linux下的tomcat配置,现在时间有限,暂且不写了..有些东西也是没有理解透彻. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ page language="java" contentType="

Codeforces Round #245 (Div. 2)

A Points and Segments (easy) 智商题,(智商捉急~) /*********************************************************** *分析:只要按Xi从小到大染成1010101010... , *1.0间隔的的序列就能保证对于任意区间[l, r]中1的个数和0的个数之差小于等于1. *注意:由于输入的Xi可能是无序的,所有要两次排序处理. *******************************************

Codeforces Round #245 (Div. 2) A - Points and Segments (easy)

水到家了 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Point{ int index, pos; Point(int index_ = 0, int pos_ = 0){ index = index_; pos = pos_; } bool operator < (const Point& a) const{ return p

Codeforces Round #245 (Div. 2) B - Balls Game

暴利搜索即可 #include <iostream> #include <vector> #include <iostream> using namespace std; int main(){ int n,k,x; cin >> n >> k >> x; vector<int> c(n); for(int i = 0 ; i < n; ++ i) cin >> c[i]; int ans = 0; fo

Codeforces Round #260 (Div. 2) A. Laptops(简单题)

题目链接:http://codeforces.com/problemset/problem/456/A A. Laptops time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output One day Dima and Alex had an argument about the price and quality of laptops.

Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister(DP)

题目链接:Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister 题意: 有n层楼,每层有m个房间,每层的两边是楼梯. 现在有一个人站在左下角,这个人必须将这一层的灯关闭后才能去另外一层. 每移动一次需要1分钟,问关闭所有灯需要多少时间. 题解: 考虑DP[i][j]表示当前已经关闭了第i层全部的灯,j=0时表示在这一层的最左边,j=1时表示在这一层的最右边. 然后推上去就行了.最后讨论一下特殊情况. 1 #include<bits/