DP好难啊啊啊啊啊啊啊,有些题还是记忆化搜比较好想,
给个矩阵,能上下左右移动,求最长从小到大路径。
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<stack>
#include<ctype.h>
using namespace std;
typedef long long ll;
const int maxn(100+5);
int n,m;
int s[maxn][maxn];
int f[maxn][maxn];
int dir[][2]={-1,0,1,0,0,-1,0,1};
bool cheak(int i,int j){
return i>=0&&i<n&&j>=0&&j<m;
}
int solve(int x,int y){
if(f[x][y])return f[x][y];
int i,j,k,t,ans=1;
for(k=0;k<4;k++){
i=x;j=y;
i+=dir[k][0];j+=dir[k][1];
if(cheak(i,j)&&s[i][j]<s[x][y]){
t=1+solve(i,j);
if(t>ans)ans=t;
}
}
return f[x][y]=ans;
}
int main(){
int ans;
while(cin>>n>>m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>s[i][j];
}
}
ans=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
f[i][j]=solve(i,j);
if(ans<f[i][j])ans=f[i][j];
}
}
cout<<ans<<endl;
}
return 0;
}