【动态规划1】动态规划的引入 P1434 [SHOI2002]滑雪
状态转移方程:
if(a[nr][nc]>a[r][c]&&cnt[nr][nc]<cnt[r][c]+1){
cnt[nr][nc]=cnt[r][c]+1;
dfs(nr,nc);
}
AC代码(枚举+深搜dfs)
提供一组测试数据:
输入:
3 3
2 2 2
2 1 2
2 2 2
输出:
2
AC代码(枚举+深搜dfs)如下:
#include <bits/stdc++.h>
#define maxn 105
using namespace std;
int cnt[maxn][maxn],a[maxn][maxn],mx;
int n,m,next[][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int r,int c){
int k,nr,nc;
for(k=0;k<4;k++){
nr=r+next[k][0],nc=c+next[k][1];
if(0<=nr&&nr<=n&&0<=nc&&nc<=m)
if(a[nr][nc]>a[r][c]&&cnt[nr][nc]<cnt[r][c]+1){
cnt[nr][nc]=cnt[r][c]+1;
dfs(nr,nc);
}
}
}
int main(){
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]),cnt[i][j]=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dfs(i,j);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
mx=max(mx,cnt[i][j]);
printf("%d\n",mx);
return 0;
}
60分代码(深搜dfs)
60分代码(深搜dfs)代码如下:
#include <bits/stdc++.h>
#define maxn 105
using namespace std;
int cnt[maxn][maxn],a[maxn][maxn],mx;
int n,m,next[][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int r,int c){
int k,nr,nc;
for(k=0;k<4;k++){
nr=r+next[k][0],nc=c+next[k][1];
if(0<=nr&&nr<=n&&0<=nc&&nc<=m)
if(a[nr][nc]>a[r][c]&&cnt[nr][nc]<cnt[r][c]+1){
cnt[nr][nc]=cnt[r][c]+1;
dfs(nr,nc);
}
}
}
int main(){
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]),cnt[i][j]=1;
dfs(1,1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
mx=max(mx,cnt[i][j]);
printf("%d\n",mx);
return 0;
}