P1884 [NOIP2000T4]方格取数
时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

[noip2000T4]方格取数

描述

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

某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

输入格式

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

输出格式

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

测试样例1

输入

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

取自http://www.cnblogs.com/TonyNeal/p/codevs1043.html;

思路一:
我们设f[i,j,k,l]表示第一条路走到(i,j),第二条路走到(k,l)的路线。
那么状态转移方程很好得出:
f[i,j,k,l]=max{f[i-1,j,k-1],f[i-1,j,k,l-1],f[i,j-1,k-1,l],f[i,j-1,k,l-1]}+(i==k&&j==l ? a[i][j] : a[i][j]+a[k][l])
值得注意的是:最后加上这个值的时候要注意如果路径走到同一点不能重复统计。
时间复杂度:O(n4),空间复杂度O(n4),对于本题n<=10完全足够。
思路二:
虽然思路一对于本题完全足够,但是如果n的范围大些的话,就无法办到了。
针对思路一,我们发现了问题,有一些状态是可以合并的,最重要的是:思路一,我们是同时开始走的,那么不必记录向右、向下的具体路径,只需要记录步数,显然,两条路的步数是统一的,然后再记录向下或向右的次数,就能根据这两者推算出向下或向右的次数。
那么设f[i,j,k]表示走到了第i步,第一条路径向走了j步,第二条路径向走了k步。
那么f[i,j,k]=max{f[i-1,j,k],f[i-1,j-1,k],f[i-1,j-1,k-1],f[i-1,j,k-1]}+(j==k ? a[i-j+1][i] : a[i-j+1][j]+a[i-k+1][k]);
显然,我们也要判断路径是否走到同一点,所以有后面的那个if( ? : 三目运算符)

时间复杂度:O(2n3),空间复杂度O(2n3),优化了一维。从n的四方优化至n的三方,是一个很大的进步。

#include<bits/stdc++.h>
using namespace std;
#define ll __int64
#define esp 1e-10
const int N=1e2+,M=1e6+,mod=1e9+,inf=1e9+;
int dp[N][N][N];
int mp[N][N];
int max(int x,int y,int z,int w,int u)
{
return max(u,max(max(x,y),max(z,w)));
}
int main()
{
int x,y,z,i,t;
scanf("%d",&x);
while()
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(u==&&v==&&w==)
break;
mp[u][v]=w;
}
for(i=;i<=*x;i++)
{
for(t=;t<=i&&t<=x;t++)
{
for(int j=;j<=i&&j<=x;j++)
dp[i][t][j]=max(dp[i][t][j],dp[i-][t-][j],dp[i-][t-][j-],dp[i-][t][j],dp[i-][t][j-])+((t==j)?mp[t][i-t+]:(mp[j][i-j+]+mp[t][i-t+]));
}
}
printf("%d\n",dp[*x][x][x]);
return ;
}

tyvj 1884 [NOIP2000T4]方格取数 || codevs 1043 dp的更多相关文章

  1. codevs_1043 方格取数(棋盘DP)

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

  2. HDU 1565 方格取数(1) 轮廓线dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...

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

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

  4. P1004 方格取数(四维dp)

    P1004 方格取数 思路如下 这题是看洛谷大佬的思路才写出来的,所以我会把大佬的思路展示如下: 1⃣️:我们可以找到一个叫思维dp的东西,dp[i][j][k][l],其中前两维表示一个人从原点出发 ...

  5. P1004 方格取数——奇怪的dp

    P1004 方格取数 题目描述 设有 \(N\times N\) 的方格图 \((N\leq 20)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 \(0\) .如下图所示(见样例) ...

  6. hdu2167 方格取数 状态压缩dp

    题意:      方格取数,八个方向的限制. 思路:      八个方向的不能用最大流了,四个的可以,八个的不能抽象成二分图,所以目测只能用dp来跑,dp[i][j]表示的是第i行j状态的最优,具体看 ...

  7. 洛谷 P1004 方格取数 【多进程dp】

    题目链接:https://www.luogu.org/problemnew/show/P1004 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 ...

  8. 方格取数(多线程dp,深搜)

    https://www.luogu.org/problem/P1004 题目描述 设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某 ...

  9. 8786:方格取数 (多线程dp)

    [题目描述] 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走 ...

随机推荐

  1. 【BZOJ3998】[TJOI2015]弦论 后缀自动机

    [BZOJ3998][TJOI2015]弦论 Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T ...

  2. NodeJS版本EasyDarwin开源流媒体服务器开发心得

    title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...

  3. 64位matlab mex64位编译器解决方案

    安装libsvm的时候用到了mex -setup,有的会报 Could not find the 64-bit compiler. This may indicate that the "X ...

  4. view {display:block}

    view {display:block}

  5. AngularCli项目中添加字体图标(Font)详解

    本文主要讲如何在AngularCli生成的项目中使用字体图标. 一 SVG图标准备 将需要转换为字体图标的图片转换为SVG格式. 这个让项目视觉设计师搞定即可. 二 SVG图标转Font 可以通过Ic ...

  6. 常用代码块:创建httpclient 2

    HttpGet httpGet = new HttpGet(url);SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(ne ...

  7. 0x01 MySQL What's DataBase

    0x01 数据库管理软件的由来 在此之前,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅能存在于某一台机器上. 如果暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在 ...

  8. Linux用户相关文件之用户信息文件

    1.文件地址: /etc/pssswd -rw-r--r--. 1 root root 936 10月 6 12:50 /etc/passwd 2.文件内容: xiaol_1:x:501:501::/ ...

  9. T-SQL利用笛卡尔积累计、累加

    T-SQL利用笛卡尔积累计.累加 笛卡尔积 --原始数据 select templateid,needitem1Count from db_tank..TS_CardMain --累计数据 selec ...

  10. Ubantu安装Odoo10学习日志

    Windows安装是十分简单的,无论是何种方式,在了解大体情况下,我开始尝试下将Odoo搭建部署在Ubantu上. 1.Odoo是什么? Odoo是一个开源框架,针对ERP的需求发展出来,适合定制出符 ...