[POJ 2329] Nearest number-2
Link:
Solution:
比较明显的$dp$,但爆搜好像也能过
用多个方向$dp$来解决此题,最后汇总答案即可
一开始我写了4个,但后来发现只要相反的2个方向即可,同时不用分别记录答案,直接不断更新答案即可
要特别注意对特例的判断:
不能只判断其最近距离相同且最近点相同!
仅当$(a1,b1)$和$(a2,b2)$当前都仅有一个最近点且其相同时才不增加权值
否则可能$(a2,b2)$有多个最近点但正好记录了与$(a1,b1)$最近点相同的点
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib> using namespace std; const int MAXN=+,INF=<<;
struct number{int cnt,d,x,y;}dp[MAXN][MAXN];
int n,dat[MAXN][MAXN]; void check(int a,int b,int l,int r)
{
if(dp[a][b].d+<dp[l][r].d)
dp[l][r]=dp[a][b],dp[l][r].d++;
else if(dp[a][b].d+==dp[l][r].d) //注意这里的判断细节
{
if(dp[l][r].cnt== && dp[a][b].cnt== && dp[l][r].x==dp[a][b].x && dp[l][r].y==dp[a][b].y) return;
dp[l][r].cnt+=dp[a][b].cnt; //cnt都为1时才返回
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
scanf("%d",&dat[i][j]),dp[i][j].d=INF;
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
{
if(dat[i][j]) dp[i][j].d=,dp[i][j].x=i,dp[i][j].y=j,dp[i][j].cnt=;
check(i,j,i+,j);check(i,j,i,j+);
}
for(int i=n;i>=;i--) for(int j=n;j>=;j--)
{
if(dat[i][j]) dp[i][j].d=,dp[i][j].x=i,dp[i][j].y=j,dp[i][j].cnt=;
check(i,j,i-,j);check(i,j,i,j-);
} for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(dat[i][j]){printf("%d ",dat[i][j]);continue;}
if(dp[i][j].cnt==) printf("%d ",dat[dp[i][j].x][dp[i][j].y]);
else printf("0 ");
}
puts("");
}
return ;
}
Review:
Hack能力不足啊,很多细节还是要多想想
如果多次判断内容相同,就放到函数里去吧
[POJ 2329] Nearest number-2的更多相关文章
- [NewTrain 10][poj 2329]Nearest Number - 2
题面: http://poj.org/problem?id=2329 题解: 这题有很多做法 1. 搜索 复杂度$O(n^4)$ 但是实际上远远达不到这个复杂度 所以可以通过 2. 对于每一个格子,我 ...
- 【POJ】2329 Nearest number - 2(搜索)
题目 传送门:QWQ 分析 在dp分类里做的,然而并不会$ O(n^3) $ 的$ dp $,怒写一发搜索. 看起来是$ O(n^4) $,但仔细分析了一下好像还挺靠谱的? poj挂了,没在poj交, ...
- POJ - 1330 Nearest Common Ancestors(基础LCA)
POJ - 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %l ...
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)
POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...
- LCA POJ 1330 Nearest Common Ancestors
POJ 1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24209 ...
- POJ 1330 Nearest Common Ancestors(lca)
POJ 1330 Nearest Common Ancestors A rooted tree is a well-known data structure in computer science a ...
- POJ 2329 (暴力+搜索bfs)
Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3943 Accepted: 1210 De ...
- POJ-2329 Nearest number - 2(BFS)
Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4100 Accepted: 1275 De ...
- POJ.1330 Nearest Common Ancestors (LCA 倍增)
POJ.1330 Nearest Common Ancestors (LCA 倍增) 题意分析 给出一棵树,树上有n个点(n-1)条边,n-1个父子的边的关系a-b.接下来给出xy,求出xy的lca节 ...
随机推荐
- win10 64位 C# 连接oracle 32位, 遇到的问题及解决
首次 本机电脑是win10系统 64位的:安装的oracle数据库也是64位的: 服务器端的oracle 是32位的: 第一次安装的pl/sql 也是64位的, 配置完 F:\app\ln_qi\p ...
- hp raid json
hp机器均已在装OS之前划好raid,统一规格为2*480G SSD, 12*4T SATA ,2*1.6T SSD,其中2*480G SSD做系统盘,划分raid1 已知disk controlle ...
- PHP基础壹
<?php //<!--//注释方式-->//<!--//echo 后面跟字符串:-->//<!--print("123");-->//& ...
- HDU 3874 Necklace 树状数组
题意:求区间内不同的数的和 离线处理,按查询右端点从小到大排序,从左往右扫一遍. 记录每个数出现的上一个位置,如果该数之前没有出现过,就加上,否则就在上一个位置减去. #include <cst ...
- 201621123033 《Java程序设计》第7周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件源:事件发生的场所,具体指各个组件. 事件:组件 ...
- CodeForces C. Maximal Intersection
http://codeforces.com/contest/1029/problem/C You are given nn segments on a number line; each endpoi ...
- 安装bcc
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD echo "deb https://repo.i ...
- Codeforces 672D Robin Hood(二分好题)
D. Robin Hood time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- [zoj] 1081 Points Within || 判断点是否在多边形内
原题 多组数据. n为多边形顶点数,m为要判断的点数 按逆时针序给出多边形的点,判断点是否在多边形内,在的话输出"Within",否则输出"Outside" / ...
- 洛谷 P4514 上帝造题的七分钟 解题报告
P4514 上帝造题的七分钟 题目背景 裸体(裸题)就意味着身体(神题). 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n \times m\)矩阵. 第二 ...