`
暴风雪
  • 浏览: 390588 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[dp]hdoj 5024

 
阅读更多

大致题意:

    问从图中的'.'到另一个'.',中间最多只能拐一个九十度的弯,最远的距离是多少

 

大致思路:

    一开始用记忆化搜索感觉没有头绪。但是仔细思考后发现(以左侧为例)这个点左侧的点数是可以通过其左边的点递推得到的,于是直接用递推得到每个点各个方向上的点数。

    推完之后遍历这个图,把每个点假设为拐点,得到所有点两个方向上和的最大值即为答案。

 

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char mapp[104][104];
int dp[104][104][10];
int n;
//012
//7*3
//654
bool inmap(int x,int y){
    if(x>=0&&x<n&&y>=0&&y<n){
        if(mapp[x][y]=='.')return 1;
    }
    return 0;
}
int main(){
    int i,j,k;
    while(cin>>n&&n){
        for(i=0;i<n;i++){
            cin>>mapp[i];
        }
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                if(mapp[i][j]=='#')continue;
                if(inmap(i-1,j-1)){
                    dp[i][j][0]=dp[i-1][j-1][0]+1;
                }
                if(inmap(i-1,j)){
                    dp[i][j][1]=dp[i-1][j][1]+1;
                }
                if(inmap(i-1,j+1)){
                        dp[i][j][2]=dp[i-1][j+1][2]+1;
                }
                if(inmap(i,j-1)){
                        dp[i][j][7]=dp[i][j-1][7]+1;
                }
            }
        }
//012
//7*3
//654
        for(i=n-1;i>=0;i--){
            for(j=n-1;j>=0;j--){
                if(mapp[i][j]!='.')continue;
                if(inmap(i,j+1)){
                    dp[i][j][3]=dp[i][j+1][3]+1;
                }
                if(inmap(i+1,j+1)){
                    dp[i][j][4]=dp[i+1][j+1][4]+1;
                }
                if(inmap(i+1,j)){
                    dp[i][j][5]=dp[i+1][j][5]+1;
                }
                if(inmap(i+1,j-1)){
                    dp[i][j][6]=dp[i+1][j-1][6]+1;
                }
            }
        }
        int res=0;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                if(mapp[i][j]!='.')continue;
                for(k=0;k<=5;k++){
                    res=max(res,(dp[i][j][k]+dp[i][j][k+2]+1));
                }
                res=max(res,(dp[i][j][0]+dp[i][j][6]+1));
                res=max(res,(dp[i][j][1]+dp[i][j][7]+1));
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

 

1
0
分享到:
评论

相关推荐

    HDOJ DP题目总结

    一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧

    Humble Numbers 简单DP

    【标题解析】:“Humble Numbers 简单DP”这个标题指的是一个与“Humble Numbers”相关的编程问题,它可以通过动态规划(Dynamic Programming, DP)方法来解决。Humble Numbers,也称为卑微数,是一类特殊的自然数,...

    hdoj杭电入门训练题

    - 定义状态dp[i]表示到达第i个位置的方案数。 - 根据题目条件建立状态转移方程。 - 使用滚动数组优化空间复杂度。 ##### 7. Climbing Worm (HDOJ1049) **知识点:** - 循环模拟。 - 简单数学计算。 **解题思路:**...

    hdu4405_HDOJ_ACM_

    【标题】"hdu4405_HDOJ_ACM_" 指的是在杭州电子科技大学(HDU)的在线判题系统(Online Judge,简称OJ)上的一道编程竞赛题目,它属于HDOJ ACM系列。这个系列通常与国际大学生程序设计竞赛(ACM/ICPC)相关,这类...

    杭电ACM HDOJ2000~2099 JAVA解题源码

    在ACM题目中,常见的算法类型包括但不限于:排序与搜索(如快速排序、二分查找)、图论(如最短路径、拓扑排序)、动态规划(DP)、回溯法、贪心算法等。JAVA源码中可能会涉及到这些算法的具体实现,例如使用...

    HDOJ暑期多校联赛第三场

    【HDOJ暑期多校联赛第三场】是2013年举办的一场面向广大编程爱好者的在线竞赛,由IOI(国际奥林匹克信息学竞赛)的冠军CLJ设计题目,旨在提升参赛者的信息学和算法解决能力。这次比赛涵盖了丰富的编程和算法知识点,...

    动态规划 dp ppt

    动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相互重叠的子问题来求解复杂问题的方法。动态规划的主要思想是将一个问题分解成多个阶段,每个阶段都有一个...

    C#可视化连连看实现 广度优先,动态规划,回溯

    在本项目中,"C#可视化连连看实现 广度优先,动态规划,回溯" 是一个使用C#编程语言实现的连连看游戏,它融合了三种算法:广度优先搜索(BFS)、动态规划(DP)和回溯法。这些算法在解决复杂问题时非常有效,尤其是...

    leetcode中国-MyAlgorithmSolutions::balloon:记录我所有的算法/数据结构

    HDOJ LeetCode 程序员面试金典 剑指OFFER PAT 甲级 乙级 ACWing 算法基础班 快排 归并 二分 高精度 前缀和差分 双指针 位运算 离散化 区间合并 单链表 双链表 栈 队列 单调栈 单调队列 KMP Tire 并查集 堆 哈希表 ...

    AC自动机题解1

    然后通过动态规划(DP)方法,计算最少需要改变多少个碱基以避免匹配到任何致病片段。这里的关键是,失败指针的构建要考虑到即使在当前节点找不到匹配,也要尝试在失败链中寻找匹配。 总结,AC自动机是一种强大的...

    在线精选OJ介绍

    12. HDU (HDOJ):杭州电子科技大学的在线评测系统。 推荐的使用策略: - POJ:北京大学的OJ,拥有数千道题目,适合专项训练。对于初学者,可以从AC率高的题目开始;有一定基础的OIer可以尝试每页40-50题;高手则应...

    北邮网研院考研复试08-12年上机真题及答案.pdf

    同时,文件还提到,具有ACM编程竞赛经验的考生在这种机试环节中会有一定的优势,建议考生在如九度在线编程平台(9DP)、北京大学在线编程平台(PKU JudgeOnline)和杭州电子科技大学在线编程平台(HDOJ)等平台上...

Global site tag (gtag.js) - Google Analytics