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

题意:

  给你一个n*m的网格,每个格子上有一个数字a[i][j]。

  一个人从左上角走到右下角,一个人从左下角走到右上角,要求两条路径有且仅有一个交点。

  问你除去交点格子上的数字,路径上数字之和最大是多少。

题解:

  表示状态:

    dp[i][j][0/1/2/3] = max sum

    表示从某个角走到(i,j)这个格子,最大路径上数字之和

    0,1,2,3分别代表左上角、右上角、左下角、右下角

  找出答案:

    路径相交共有两种方式:

    

    枚举交点(i,j)。

    ans = max dp[i-1][j][0] + dp[i+1][j][3] + dp[i][j-1][2] + dp[i][j+1][1]

    ans = max dp[i-1][j][1] + dp[i+1][j][2] + dp[i][j-1][0] + dp[i][j+1][3]

  如何转移:

    四种情况分别算:

    (1)dp[i][j][0] = max dp[i-1][j][0]+a[i][j]

       dp[i][j][0] = max dp[i][j-1][0]+a[i][j]

    (2)dp[i][j][1] = max dp[i-1][j][1]+a[i][j]

       dp[i][j][1] = max dp[i][j+1][1]+a[i][j]

    (3)dp[i][j][2] = max dp[i+1][j][2]+a[i][j]

       dp[i][j][2] = max dp[i][j-1][2]+a[i][j]

    (4)dp[i][j][3] = max dp[i+1][j][3]+a[i][j]

       dp[i][j][3] = max dp[i][j+1][3]+a[i][j]

  边界条件:

    set dp = 0

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define MAX_N 1005
 5
 6 using namespace std;
 7
 8 int n,m;
 9 int a[MAX_N][MAX_N];
10 int dp[MAX_N][MAX_N][4];
11
12 void read()
13 {
14     cin>>n>>m;
15     for(int i=1;i<=n;i++)
16     {
17         for(int j=1;j<=m;j++)
18         {
19             cin>>a[i][j];
20         }
21     }
22 }
23
24 void work()
25 {
26     memset(dp,0,sizeof(dp));
27     for(int i=1;i<=n;i++)
28     {
29         for(int j=1;j<=m;j++)
30         {
31             dp[i][j][0]=max(dp[i][j][0],dp[i-1][j][0]+a[i][j]);
32             dp[i][j][0]=max(dp[i][j][0],dp[i][j-1][0]+a[i][j]);
33         }
34     }
35     for(int i=1;i<=n;i++)
36     {
37         for(int j=m;j>=1;j--)
38         {
39             dp[i][j][1]=max(dp[i][j][1],dp[i-1][j][1]+a[i][j]);
40             dp[i][j][1]=max(dp[i][j][1],dp[i][j+1][1]+a[i][j]);
41         }
42     }
43     for(int i=n;i>=1;i--)
44     {
45         for(int j=1;j<=m;j++)
46         {
47             dp[i][j][2]=max(dp[i][j][2],dp[i+1][j][2]+a[i][j]);
48             dp[i][j][2]=max(dp[i][j][2],dp[i][j-1][2]+a[i][j]);
49         }
50     }
51     for(int i=n;i>=1;i--)
52     {
53         for(int j=m;j>=1;j--)
54         {
55             dp[i][j][3]=max(dp[i][j][3],dp[i+1][j][3]+a[i][j]);
56             dp[i][j][3]=max(dp[i][j][3],dp[i][j+1][3]+a[i][j]);
57         }
58     }
59     int ans=0;
60     for(int i=2;i<n;i++)
61     {
62         for(int j=2;j<m;j++)
63         {
64             ans=max(ans,dp[i-1][j][0]+dp[i+1][j][3]+dp[i][j-1][2]+dp[i][j+1][1]);
65             ans=max(ans,dp[i-1][j][1]+dp[i+1][j][2]+dp[i][j-1][0]+dp[i][j+1][3]);
66         }
67     }
68     cout<<ans<<endl;
69 }
70
71 int main()
72 {
73     read();
74     work();
75 }

转载于:https://www.cnblogs.com/Leohh/p/8191478.html

Codeforces 429B Working out:dp【枚举交点】相关推荐

  1. [CodeForces 332B]Maximum Absurdity[DP]

    题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...

  2. Codeforces 919D Substring (拓扑图DP)

    Codeforces 919D Substring (拓扑图DP) 手动博客搬家: 本文发表于20180716 10:53:12, 原地址https://blog.csdn.net/suncongbo ...

  3. 【CodeForces 1042B --- Vitamins】DP+位运算

    [CodeForces 1042B --- Vitamins]DP+位运算 题目来源:点击进入[CodeForces 1042B - Vitamins] Description Berland sho ...

  4. codeforces数学1600day6[CodeForces - 1029C多区间交+枚举,CodeForces 992C[数学公式推导],CodeForces 992B[质因数分解+暴力枚举]]

    A - Maximal Intersection CodeForces - 1029C 题目大意:就是给你n个区间,这n个区间有公共的区间长度为x,现在叫你从这n个区间中删掉一个使得x最大化. 解题思 ...

  5. Codeforces 1322D Reality Show (DP)

    题目链接 https://codeforces.com/contest/1322/problem/D 题面写得非常模糊,很容易读错题,建议参考翻译:https://www.luogu.com.cn/p ...

  6. CodeForces - 1579G Minimal Coverage(dp)

    题目链接:点击查看 题目大意:给出 nnn 个长度不同的木棍.设第 i−1i-1i−1 次放置木棍后的终点为 xxx,那么第 iii 个木棍有且仅有两种放置方法: 放到 [x+1,x+a[i]][x+ ...

  7. CodeForces - 1562E Rescue Niwen!(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss,将其子串按顺序展开成序列,即 {s1,s1s2,⋯,s1s2-sn,s2,s2s3,s2s3-sn,s3,s3s4,⋯,sn−1 ...

  8. CodeForces - 1551E Fixed Points(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,需要求出删掉最少的数字,使得剩下的数字至少有 kkk 个位置满足 a[i]=ia[i]=ia[i]=i 成立 题目分析:看完数据范围不难想 ...

  9. 图论500题 ---- 并查集+树形dp+枚举 求解动态的最小生成树 HDU 4126

    题目链接 题目大意: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边(可以经过可疑边新的花费构建的边),注意每次只出现一条 ...

最新文章

  1. win7 64位系统连接xp 32位共享打印机办法
  2. 黄海广老师《机器学习》慕课第二轮1月14日开课了!
  3. zkui:好用的zookeeper ui工具
  4. 《Python编程初学者指南》——1.2 Python简介
  5. ctsc2009 移民站选址
  6. MySQL高可用--MGR入门(4)异常恢复
  7. OEA 中的业务控制器设计模式
  8. mysql优化方面的面试题
  9. cst和ansys_请教一下cst、ansoft、ansys几种电磁计算软件的异同
  10. 【小程序】零基础微信小程序开发+实战项目
  11. spark on k8s:apache YuniKorn(Incubating)的助力
  12. [日常技能]手机投屏到电视的5种方法
  13. java基于sptingboot+vue的校园疫情防控系统 elementui
  14. 高德地图添加瓦片图层
  15. 《无懈可击的Web设计》_灵活的文字
  16. 数据库连接字符串的设置与读取
  17. 浅析区块链应用系统——区块链追踪溯源应用
  18. Codesys代码助手
  19. 《Activiti/Flowable  深入BPM工作流》-什么是流程变量?
  20. Kruskal-Wallis test

热门文章

  1. Android Service的思考(4)
  2. 一款炫酷Loading动画--载入成功
  3. 【转】两种方法教你在Ubuntu下轻松关闭触摸板(TinkPad)
  4. 设置路由器端口转发功能如何操作
  5. Uploadify——学习(1):在Struts2的使用
  6. 毕业设计之路(2)——初识TCP
  7. VMware Workstation 8正式版下载+密钥序列号
  8. 英特尔软件学院与中国一起迎接2008
  9. MacBook双开微信
  10. Attribute is missing the Android namespace prefix