洛谷 P1004 方格取数
程序员文章站
2022-07-04 23:36:56
[TOC] 题目 "洛谷 P1004 方格取数" 思路 方法一:四维dp 设$\text{dp[i][j][k][l]}$表示第一个人走到了$(i,j)$第二个人走到了$(k,l)$的位置时的最大和,因为可以向下走也可以向右走所以$\text{dp[i][j][k][l]=max(dp[i 1][j ......
目录
题目
思路
方法一:四维dp
设$\text{dp[i][j][k][l]}$表示第一个人走到了$(i,j)$第二个人走到了$(k,l)$的位置时的最大和,因为可以向下走也可以向右走所以$\text{dp[i][j][k][l]=max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])}$$+(i,j)$和$(k,l)$位置的数如果$i=k$并且$j=l$要减去一个。
时间复杂度为$o(n^4)$
$code$
方法一:
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> using namespace std; int n,map[10][10],dp[10][10][10][10]; //dp[i][j][k][l]表示第一个人走到了(i,j)第二个人走到了(k,l)的位置时的最大和 inline int read(){ int x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f?-x:x; } int main(){ n=read(); int x,y,w; while(1){ x=read(),y=read(),w=read(); if(!x&&!y&&!w) break; map[x][y]=w; } for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ for(int k=1;k<=n;++k){ for(int l=1;l<=n;++l){ dp[i][j][k][l]=max(max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1]),max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]))+map[i][j]+map[k][l]; if(i==k&&j==l) dp[i][j][k][l]-=map[i][j]; } } } } printf("%d\n",dp[n][n][n][n]); return 0; }
推荐阅读
-
洛谷P3600 随机数生成器(期望dp 组合数)
-
洛谷P2774 方格取数问题(最小割)
-
洛谷P3199 [HNOI2009]最小圈(01分数规划)
-
洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows(01分数规划)
-
洛谷P2252 取石子游戏(威佐夫博弈)
-
洛谷 P2532 [AHOI2012]树屋阶梯(高精度卡特兰数)
-
信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) 洛谷 P1028 记忆化递归(耙耙)
-
洛谷p1028 数的计算
-
统计方格区域内正方形和长方形的个数(洛谷P1548题题解,Java语言描述)
-
P1044 栈(卡特兰数,洛谷,java)