题目描述

设有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. Host Controller transport layer and AMPs

    The logical Host Controller Interface does not consider multiplexing/routing over the Host Controlle ...

  2. webstorm中使用java的块凝视

    webstorm中使用java的块凝视 有图有真相 使用java中非常方便得/**+enter就能高速创建类凝视.可是webstrom中没有现成的,所以我们得自己去创建一个,详细方法例如以下: 博主w ...

  3. Android--绑定服务调用服务的方法

    Service依照其启动的方式,可分为两种: 1.Started Started的Service.通过在Application里用startService(Intent intent)方法来启动.这样 ...

  4. 判断是否是iso8859-1编码

    if (null == keyword || keyword.equals("关键字")) keyword = "";            if(keywor ...

  5. hdu 1548

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. nginx list directory

    使用 http autoindex 模块列出 目录, 例如 需要将 /var/www 下的 resourcepacks 目录以 http 的方式 暴露         这样设置 nginx       ...

  7. linux下的环境文件设置说明

    工作环境设置文件 环境设置文件有两种:系统环境设置文件 和 个人环境设置文件   1.系统中的用户工作环境设置文件:   登录环境设置文件:/etc/profile        非登录环境设置文件: ...

  8. 华为P7电信4G版刷机包 EMUI2.3 官方B125 第3版 精简 ROOT

    ROM介绍 基于底包至 B125 SP03解包制作 增加自己订制的超美丽EMUI 2.3专用的全局主题 自调刷机脚本,全部权限完美百分百与官方原版相贴合. 加入Root权限并使用SuperSU 2.0 ...

  9. 轻松搞定RabbitMQ(三)——消息应答与消息持久化

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48710653 这个官网的第二个例子中的消息应答和消息持久化部分.我把它摘出来作为单独的一块 ...

  10. iOS 获取图片某一点的颜色对象(UIColor*)。

    - (UIColor *)colorAtPixel:(CGPoint)point { // Cancel if point is outside image coordinates if (!CGRe ...