动态规划(DP),模拟

题目链接: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;
}

  

时间: 2024-10-13 13:15:22

动态规划(DP),模拟的相关文章

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

动态规划(DP),类似LIS,FatMouse&#39;s Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weight相同的按照speed从大到小排列; 2.Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度: 3.path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置 4.递归输出id void output(in

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 1

#include <iostream>#include <string.h>using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; } void f( ){ int i,j; for (i=1; i<=M; i++) for (j=0;j<=T; j++) { if (i==0) dp[i][j]=0; else dp[i][j]=

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 2

70 371 10069 11 2 #include <iostream>#include <string.h>using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; }void f( ){ int i,j; for (i=M; i>=1; i--) for (j=0;j<=T; j++) { if (i==M+1) dp[i][j

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 3

#include <iostream>#include <string.h>using namespace std;int dp[1005], w[105],v[105],T,M;int max(int x,int y) { return x>y?x:y; }void f( ){ int i,j; for (i=1; i<=M; i++) for (j=T;j>=0; j--) if (j>=w[i]) dp[j]=max(dp[j],dp[j-w[i]]+

动态规划 DP

动态规划 DP 我们用f[ i ] 表示从 i 点出发到达终点的最多能休息的时间 然后我们发现 状态转移方程f[ i ] = f[ i+1 ] +1 ; 当该点 并没有工作计划时 f[ i ] = max(f[ i+len ],f[ i ]); 当该点 有工作计划时 一个或若干个 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const i

poj 1458 动态规划DP

//  poj 1458  zoj 1733  最长公共子序列  DP #include <iostream>#include <string.h>#define N 1005using namespace std ;char  s1[N],s2[N];   int dp[N][N];int max(int a,int b)   {    return a>b ? a : b ;  }void f(int n,int m){   int i,j;    for (i=0; i

ppt Fibonacii数列的第n项------动态规划DP

#include <stdio.h>#define MAX 50+1int fib(int n){ int i,a[MAX]; a[1]=a[2]=1; for (i=3; i<=n; i++)               a[i]=a[i-1]+a[i-2];          return a[n];}void main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib( n ) );} ppt

hdu2571 命运 动态规划Dp

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑! 可怜的yifenfei为了去救MM,义无返顾地跳进了