poj 1088 滑雪 DP

来源:互联网 发布:vue仿豆瓣app源码下载 编辑:程序博客网 时间:2024/04/30 09:57

一个r*c 2维数组,包含高度,求最长下降子序列的长度,

每个节点只能移动上下左右四个格子。


dp[i][j]表示从第i,j格子开始的最长下降子序列长度。

先对数组内高度从低到高排序,之后按照高度从低到高 遍历 求dp即可。


测试数据:

5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 91 111 21 21 3 1 3 22 21 2 4 32 2 1 2 3 44 77 6 5 4 3 2 11 5 1 1 1 1 11 4 3 1 1 1 11 5 6 7 8 1 13 39 1 25 6 78 4 33 41 2 3 48 7 6 59 10 11 123 30 0 00 5 00 0 012 131   1 30  4  800  6  7  8  99 10 1223 120 30 30 4 16 15 14 13 12 11 121 22 99 444444 88 9926 27 9928 9929 3000 456 140 39 1 90 36 35 34 33 3992 30001 789  141 42 4000 44  88 46 47 48 49 50 897  11 59 1 57 56  85 54 53 52 51 908 161 77 56 64 444 66 67 68 69 70 1234 180 79 78 77 76 75 74 73 72 71 12345 181 82 2  2 4 86 5 88 8 90 3456  1100 99 98 97 96 95 94 93 92 91 567 1890 654 623 154 683 15414 86549 633 123 456 123456  19517 45632 643164 3478643 43 16 431 64453132 689431 746546 15643 164543 13146543 13474 314789 4352154 65431 631 654324 65132 89547  34567312 1 113 121   1 30  4  800  6  7  8  99 10 1223 120 30 30 4 16 15 14 13 12 11 121 22 99 444444 88 9926 27 9928 9929 3000 456 140 39 1 90 36 35 34 33 3992 30001 789  141 42 4000 44  88 46 47 48 49 50 897  11 59 1 57 56  85 54 53 52 51 908 161 77 56 64 444 66 67 68 69 70 1234 180 79 78 77 76 75 74 73 72 71 12345 181 82 2  2 4 86 5 88 8 90 3456  1100 99 98 97 96 95 94 93 92 91 567 1890 654 623 154 683 15414 86549 633 123 456 123456  19517 45632 643164 3478643 43 16 431 64453132 689431 746546 15643 164543 13146543 13474 314789 4352154 65431 631 654324 65132 89547  34567312 1 13 30 1 21 0 12 1 03 30 0 00 0 00 0 01 1010 101 2 300 4 5 6 7 8 9 1020 19 18 17 16 15 14 13 12 1121 22 23 24 25 26 27 28 29 3040 39 38 37 36 35 34 33 32 3141 42 43 44 45 46 47 48 49 5060 59 58 57 56 55 54 53 52 5161 62 63 64 65 66 67 68 69 7080 79 78 77 76 75 74 73 72 7181 82 83 84 85 86 87 88 89 90100 99 98 97 96 95 94 93 92 914 41 2 3 41 2 3 41 2 3 41 2 3 44 41 2 2 11 4 4 11 3 3 11 2 2 13 39 1 25 6 78 4 3/////////////////////////////////////////////////////////////////////////////251224374122273731197444

#include <iostream>#include <iostream>#include <algorithm>#include <stdio.h>#include <cstring>using namespace std;#define MAX_N (101*101)struct point{int r;int c;int h;}POINT[MAX_N];bool cmp(const point &a,const point &b){return a.h < b.h;}struct move{int di;int dj;}MOVE[]={ {-1,0},{1,0},{0,1},{0,-1} };int H[101][101];int dp[101][101];int pindex=1;int R,C;void dump(){for(int i=1;i<=R;i++){for(int j=1;j<=C;j++){printf("dp[%d][%d] = [%d] \t",i,j,dp[i][j]);}printf("\n");}}int main(){while(cin>>R>>C){pindex=1;memset(dp,0,sizeof(dp));for(int i=1;i<=R;i++){for(int j=1;j<=C;j++){int h;cin>>h;POINT[pindex].r=i;POINT[pindex].c=j;POINT[pindex].h=h;pindex++;H[i][j]=h;}}sort(POINT+1,POINT+pindex,cmp);int maxret = 0;for(int i = 1;i<pindex;i++){int r,c,h;r=POINT[i].r;c=POINT[i].c;h=POINT[i].h;int maxd = 0;for(int _m=0;_m< 4;_m++){int di= MOVE[_m].di;int dj= MOVE[_m].dj;int ni = r+di;int nj = c+dj;if( 1<= ni && ni <= R && 1<=nj&& nj<= C){if(h > H[ni][nj]){//int d = h - H[ni][nj] + dp[ni][nj];int d = dp[ni][nj] +1;if(d > maxd )maxd= d;}}}dp[r][c] = maxd;if(maxd > maxret)maxret = maxd;}//dump();cout<<maxret+1<<endl;}}


原创粉丝点击