您的位置:首页 > 其它

poj 1088 滑雪

2011-06-18 17:56 316 查看
/*
解题报告:
1、不定起点和终点的DAG上DP 水题
2、可以考虑下怎样把路径输出来:见注释中求路径代码
注:该题为DAG上 DP不定终点起点的经典题
*/
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 110;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int g[MAXN][MAXN], dis[MAXN][MAXN];
int R, C;
int dp(int r, int c)
{
int &ans = dis[r][c];
if(ans != 0)
return ans;
int temp = 0;
for(int i=0; i<4; ++i)
{
if(r+dir[i][0]>=1 && r+dir[i][0]<=R && c+dir[i][1]>=1 && c+dir[i][1]<=C && g[r+dir[i][0]][c+dir[i][1]]<g[r][c])
{
temp = dp(r+dir[i][0], c+dir[i][1]) + 1;
}
if(temp>ans)
ans = temp;
}
return ans;
}
int main()
{
int i, j;
while(cin>>R>>C)
{
for(i=1; i<=R; i++)
for(j=1; j<=C; j++)
cin>>g[i][j];
memset(dis, 0, sizeof(dis));
int nMax = 0;
for(i=1; i<=R; ++i)
{
for(j=1; j<=C; ++j)
{
if(nMax < dp(i, j))
nMax = dp(i, j);
}
}
cout<<(nMax+1)<<endl;
}
return 0;
}
//求路径
/*
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 110;
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int g[MAXN][MAXN], dis[MAXN][MAXN];
int R, C;
//方法二 用的数据结构
struct Route
{
int r;
int c;
Route()
{
r = 0;
c = 0;
}
Route(int R, int C)
{
r = R;
c = C;
}
}route[MAXN][MAXN];

int dp(int r, int c)
{
int &ans = dis[r][c];
if(ans != 0)
return ans;
int temp = 0;
for(int i=0; i<4; ++i)
{
if(r+dir[i][0]>=1 && r+dir[i][0]<=R && c+dir[i][1]>=1 && c+dir[i][1]<=C && g[r+dir[i][0]][c+dir[i][1]]<g[r][c])
{
temp = dp(r+dir[i][0], c+dir[i][1]) + 1;
}
if(temp>ans)
{
ans = temp;
route[r][c] =  Route(r+dir[i][0], c+dir[i][1]);
}
}
return ans;
}

//方法一
void print_ans(int r, int c)
{
int i;
cout<<"("<<r<<","<<c<<") ";
for(i=0; i<4; ++i)
{
if(r+dir[i][0]>=1 && r+dir[i][0]<=R && c+dir[i][1]>=1 && c+dir[i][1]<=C && dis[r][c] == dis[r+dir[i][0]][c+dir[i][1]]+1)
{
print_ans(r+dir[i][0], c+dir[i][1]);
break;
}
}
}
void print_ans2(int r, int c, int nMax)
{
while(nMax--)
{
cout<<"("<<r<<","<<c<<") ";
r = route[r][c].r;
c = route[r][c].c;
}
}
int main()
{
int i, j;
int iindex, jindex;
while(cin>>R>>C)
{
for(i=1; i<=R; i++)
for(j=1; j<=C; j++)
cin>>g[i][j];
memset(dis, 0, sizeof(dis));
int nMax = 0;
for(i=1; i<=R; ++i)
{
for(j=1; j<=C; ++j)
{
if(nMax < dp(i, j))
{
nMax = dp(i, j);
iindex = i;
jindex = j;
}
}
}
cout<<(nMax+1)<<endl;
print_ans(iindex, jindex);
cout<<endl;
print_ans2(iindex, jindex, nMax+1);
}
return 0;
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: