码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划(DP),模拟

时间:2016-02-24 10:52:47      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://poj.org/problem?id=1088

Memory: 372KTime: 16MSLanguage: C++Result: Accepted

解题报告:

1、d[i][j]表示maps[i][j]所能达到的最长长度

2、状态转移方程

     d[i][j]=max(d[i][j]四周的d[x][y])+1;

3、由于,如果没有将d[i][j]求出来是不可能将d[x][y]求出来的,所以这里需要将maps排序,才能DP

#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

#define MAX 105

int row,col,len;
int maps[MAX][MAX];//存表格
int mov[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int d[MAX][MAX];//d[i][j]表示maps[i][j]所能到达的最长长度
int ans;

struct Node{
    int x,y;
    int value;//海拔
}node[MAX*MAX];

bool operator <(const Node a,const Node b)
{
    return a.value<b.value;
}

void DP()
{
    ans=0;
    memset(d,0,sizeof(d));
    for(int i=0;i<len;i++)
    {
        int x=node[i].x;
        int y=node[i].y;
        for(int j=0;j<4;j++)
        {
            int tx=x+mov[j][0];
            int ty=y+mov[j][1];
            if(tx>=0&&tx<row&&ty>=0&&ty<col)
            {
                if(maps[x][y]>maps[tx][ty])
                {
                    d[x][y]=max(d[x][y],d[tx][ty]+1);
                }
            }
            ans=max(ans,d[x][y]);
        }
    }
}

int main()
{
    scanf("%d%d",&row,&col);
    len=0;
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
            {
                scanf("%d",&maps[i][j]);
                node[len].x=i;
                node[len].y=j;
                node[len++].value=maps[i][j];
            }
    }
    sort(node,node+len);
    DP();
    printf("%d\n",ans+1);
    return 0;
}

 

  

 

动态规划(DP),模拟

标签:

原文地址:http://www.cnblogs.com/TreeDream/p/5212089.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!