题目描述

设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):

某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

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

输入格式

输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

输出格式

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

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

67

思路:看做两个人从左上角开始走,定义dp[i][j][k][l]=第一个人走到(i,j),第二个人走到(k,l).状态转移方程为:dp[i][j][k][l]=max(dp[i-1][j][k-1][j],dp[i-1][j][k][j-1],dp[i][j-1][k-1][j],dp[i][j-1][k][j-1])+(i==j&&k==l)?a[i][j]:(a[i][j]+a[k][l]);

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int a[N][N];
int n;
int dp[N][N][N][N];
int main()
{
scanf("%d",&n);
int y,x,v;
while(scanf("%d%d%d",&y,&x,&v)!=EOF)
{
if(!y&&!x&&!v)
break;
a[y][x]=v;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int k=;k<=n;k++)
for(int l=;l<=n;l++)
{
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-][j][k-][l]);
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-][j][k][l-]);
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-][k-][l]);
dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-][k][l-]);
dp[i][j][k][l]+=((i==k&&j==l)?a[i][j]:(a[i][j]+a[k][l])); // 数取走后变为0,所以走到同一点时只需加a[i][j]
} printf("%d\n",dp[n][n][n][n]);
return ;
}

因为开始时两个人均从左上角走起,且同步。所以在任意时刻两个人的横纵坐标之和 是相同的。所以我们可以优化为3维。设dp[k][i][j] 为两个人的横纵坐标之和为k,第一个人的横坐标为i,第二个人的横坐标为j。状态转移方程:dp[k][i][j]=max(dp[k-1][i-1][j],dp[k-1][i-1][j-1],dp[k-1][i][j],dp[k-1][i][j-1])+(i==j)?a[k-i+2][i]:(a[k-i+2][i]+a[k-j+2][j]);

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int a[N][N];
int n;
int dp[N][N][N];
int main()
{
scanf("%d",&n);
int y,x,v;
while(scanf("%d%d%d",&y,&x,&v)!=EOF)
{
if(!y&&!x&&!v)
break;
a[y][x]=v;
}
for(int k=;k<=*n;k++)
{
for(int i=;i<=k&&i<=n;i++)
{
for(int j=;j<=k&&j<=n;j++)
{
dp[k][i][j]=max(dp[k-][i-][j],dp[k][i][j]);
dp[k][i][j]=max(dp[k-][i-][j-],dp[k][i][j]);
dp[k][i][j]=max(dp[k-][i][j],dp[k][i][j]);
dp[k][i][j]=max(dp[k-][i][j-],dp[k][i][j]);
dp[k][i][j]+=((i==j)?a[k-i][i]:(a[k-i][i]+a[k-j][j]));
}
}
}
printf("%d\n",dp[*n][n][n]);
return ;
}

NOIP2000提高组(RQNOJ314)方格取数的更多相关文章

  1. 1823:【00NOIP提高组】方格取数

    #include<bits/stdc++.h> using namespace std; ][]; ][][][]; inline int max(int x,int y) { retur ...

  2. HRBUST - 1214 NOIP2000提高组 方格取数(多线程dp)

    方格取数 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0.如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走过的 ...

  3. 1043 方格取数 2000年NOIP全国联赛提高组

    1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description 设有N* ...

  4. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  5. NOIP2000方格取数(洛谷,动态规划递推)

    先上题目: P1004 方格取数 下面上ac代码: ///如果先走第一个再走第二个不可控因素太多 #include<bits/stdc++.h> #define ll long long ...

  6. HRBUST 1214 方格取数

    方格取数 Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HRBUST. Original ID: 12 ...

  7. [动态规划]P1004 方格取数

    ---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...

  8. codevs 方格取数

    1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  9. dp4--codeVs1043 方格取数

    dp4--codeVs1043 方格取数 一.心得 二.题目 1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Dia ...

随机推荐

  1. JrtpLib vs2012环境下编译及使用 GotoFirstSourceWithData 方法 进不去

    项目中有一项功能是接收rtp数据,接收rtp的可以用PJMedia,可以用JrtpLib.PJMedia库无法解决内外网的问题,只有用Jrtp库了. 首先说下Jrtp 的编译问题,我是在windows ...

  2. WPF 基础到企业应用系列1——开篇故意

    參考资料 提到參考资料,大家第一感觉就是MSDN,当然我也不例外.这个站点基本上是学习微软技术的首选站点,除了这个站点以外,我还參考了非常多其它的社区和站点,基本上都在.NET 技术社区之我见(英文篇 ...

  3. C# trim split dataGrid

    C#中Trim().TrimStart().TrimEnd()的用法:     这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一 ...

  4. 再过半小时,你就能明白kafka的工作原理了

    本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息" ...

  5. kubernetes的Service Account和secret

    系列目录 Service Account Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它 ...

  6. kubernetes资源调度之LimitRange

    系列目录 LimitRange从字面意义上来看就是对范围进行限制,实际上是对cpu和内存资源使用范围的限制 前面我们讲到过资源配额,资源配额是对整个名称空间的资源的总限制,是从整体上来限制的,而Lim ...

  7. paxos算法之粗浅理解

    paxos出身 paxos出身名门,它爹是没多久前获得图灵奖的在分布式领域大名鼎鼎的LeslieLamport. paxos为何而生 那么Lamport他老人家为什么要搞这个东东呢,不是吃饱了撑的,而 ...

  8. Ionic + AngularJS angular-translate 国际化本地化解决方案

    欢迎访问我们的网站,网站上有更多关于技术性的交流:http://www.ncloud.hk/技术分享/ionic-plus-angularjs-angular-translate-国际化本地化解决方案 ...

  9. unittest相关文档

    文档链接: http://blog.csdn.net/wangst4321/article/details/8454118

  10. 如果在 Code First 模式下使用,则使用 T4 模板为 Database First 和 Model First

    web.config里的链接字符串最好和app.config里相同,因为ef的链接字符串需要一些特殊的参数