2013寒假练习 1016:滑雪
2013-02-04 17:28
387 查看
地址:http://acm.bit.edu.cn/mod/programming/view.php?id=667
经典DP好题。给出一个二维数组,求一个最长的下降路径。其中路径的合法性是指可以往上下左右走。用dp[a][b]表示从map[a][b]开始能走出的最长下降路径的长度,那么dp[a][b]=max{dp[X][Y]+1}其中XY位于AB的上下左右,并且有map[A][B]>map[X][Y]。最后答案应该等于所有dp[a][b]中的最大值。然而这题的DP用递推难以实现,故可以用记忆化搜索。
经典DP好题。给出一个二维数组,求一个最长的下降路径。其中路径的合法性是指可以往上下左右走。用dp[a][b]表示从map[a][b]开始能走出的最长下降路径的长度,那么dp[a][b]=max{dp[X][Y]+1}其中XY位于AB的上下左右,并且有map[A][B]>map[X][Y]。最后答案应该等于所有dp[a][b]中的最大值。然而这题的DP用递推难以实现,故可以用记忆化搜索。
#include<iostream> using namespace std; int map[105][105]; int dp[105][105]; int m,n; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int dfs(int a,int b) //记忆化搜索 { if(dp[a][b]!=-1) return dp[a][b]; int max=1,ans; for(int i=0;i<=3;i++) //四个方向 { if(a+dir[i][0]>=0&&a+dir[i][0]<m&&b+dir[i][1]>=0&&b+dir[i][1]<n) { if(map[a][b]>map[a+dir[i][0]][b+dir[i][1]]) { ans=dfs(a+dir[i][0],b+dir[i][1]); if(ans+1>max) max=ans+1; } } } dp[a][b]=max; return max; } int main() { int i,j,ans,max; while(~scanf("%d%d",&m,&n)) { max=-1; memset(dp,-1,sizeof(dp)); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",&map[i][j]); } } for(i=0;i<m;i++) { for(j=0;j<n;j++) { ans=dfs(i,j); if(ans>max) max=ans; } } printf("%d\n",max); } return 0; }
相关文章推荐
- 寒假练习 1016 滑雪
- 2013寒假练习 1006:The most frequent number
- 2013寒假练习 1021:Pascal's Travels
- BIT寒假练习-2013__1006:The most frequent number
- 2013寒假练习 1039 Unit Fraction Partition
- 2013寒假练习 1019 The Little Architect II
- 2013寒假练习 1060 Is It A Tree?
- 2013 寒假练习 1048 n以内约数最多的数
- BIT寒假练习-2013__1007:Number Converter
- 2013寒假练习 1002: Roman numerals
- 2013寒假练习 1012:导弹防御问题
- 2013寒假练习 1026 Til the Cows Come Home
- 2013寒假练习 1051 Score
- BIT寒假练习-2013__1008:Putting Apples
- 2013寒假练习 1015:Edit Distance
- 2013寒假练习 1052 青蛙的约会
- 2013寒假练习 1007:Number Converter
- BIT寒假练习-2013__1009:Number Sequence
- BIT寒假练习-2013__1010:Maximum Sum
- 2013寒假练习 1004:Who is the Smartest Man