P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
第一次写DP,,,本题是从下向上逐渐查找路径的最大值
#include <bits/stdc++.h>
using namespace std;
const int MAX=1002;
int num[MAX][MAX];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>num[i][j];
}
}
for(int i=n-1;i>0;i--){
for(int j=1;j<=i;j++){
num[i][j]=max(num[i+1][j],num[i+1][j+1])+num[i][j];
}
}
cout<<num[1][1];
}
P1434 [SHOI2002]滑雪
#include <bits/stdc++.h>
using namespace std;
const int MAX=102;
int n,m;
int num[MAX][MAX],ans=0,len[MAX][MAX];
int dir[4][2]={
{0,1},
{-1,0},
{0,-1},
{1,0}
};
bool check(int x,int y){
if(x<=0||x>n||y<=0||y>m)
return false;
return true;
}
int dfs(int x,int y){
if(len[x][y]!=1)
return len[x][y];
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(check(dx,dy)&&num[dx][dy]<num[x][y]){
len[x][y]=max(len[x][y],dfs(dx,dy)+1);
}
}
return len[x][y];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>num[i][j];
len[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans=max(ans,dfs(i,j));
}
}
cout<<ans<<endl;
}