DP::Poj1088 滑雪

来源:互联网 发布:2017中国云计算500强 编辑:程序博客网 时间:2024/05/21 18:38

这题不难,状态转移方程很快就写出来 m[i, j]=max{m[i-1, j](下)+1,m[i, j-1](左)+1,m[i+1, j](上)+1,m[i, j+1](右)+1}(若下左上右对应元素比s[i, j]小,则对应的m[ ]就可以出现在方程中)

具体实现的话也很简单,处理max{ }用冒泡法,注意边界就行。在cout的时候,没有“+1 ”,试了几组数据,才知道那个错误。之所以要加上1,是因为最后那个m[ ]没有把最大元素算进去! 

#include <iostream>using namespace std;int s[101][101];int m[101][101]={0};int findmax(int R,int C,int i,int j){int temp=0;if(m[i][j]>0) return m[i][j];if(i-1>0 && s[i][j]>s[i-1][j]){temp=findmax(R,C,i-1,j)+1;if(temp>m[i][j])m[i][j]=temp;}if(j-1>0 && s[i][j]>s[i][j-1]){temp=findmax(R,C,i,j-1)+1;if(temp>m[i][j])m[i][j]=temp;}if(i+1<=R && s[i][j]>s[i+1][j]){temp=findmax(R,C,i+1,j)+1;if(temp>m[i][j])m[i][j]=temp;}if(j+1<=C && s[i][j]>s[i][j+1]){temp=findmax(R,C,i,j+1)+1;if(temp>m[i][j])m[i][j]=temp;}return m[i][j];}int findmaxm(int R,int C){int max=0;for(int i=1;i<=R;i++)for(int j=1;j<=C;j++){m[i][j]=findmax(R,C,i,j);if(m[i][j]>max)max=m[i][j];}return max;}int main(){int R,C;cin >> R >> C;for(int i=1;i<=R;i++)for(int j=1;j<=C;j++)cin>>s[i][j];cout<<findmaxm(R,C)+1<<endl;return 0;}


 

原创粉丝点击