(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)
24
思路:首先,这题绝对不系贪心,然后,我们要知道,它不是先统计再走,而是先走再统计, 还有,他走到最后一个点是特殊的。 代码:
-
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[1001][1001],f[1001][1001],i,j;
bool ok[1001][1001];
void print(register int x,register int y)
{
if(x==1&&y==1) {printf("(1,1)");return;}
if(ok[x][y]) print(x-1,y);
else print(x,y-1);
printf("->(%d,%d)",x,y);//输出。
}
void dp()
{
memset(f,0x3f,sizeof(f));
f[1][1]=a[1][1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(i==1&&j==1) continue;//跳出本次循环,直接进入下一次循环。
if(f[i-1][j]<f[i][j-1])
{
ok[i][j]=true;
f[i][j]=f[i-1][j]+a[i][j];//计算。
}
else
{
f[i][j]=f[i][j-1]+a[i][j];//否则计算这个。
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)//读数。
{
scanf("%d",&a[i][j]);if(a[i][j]==0) a[i][j]=50234567;}
dp();//调用。
print(n,m);
printf("\n%d",f[n][m]-a[n][m]);//输出。
return 0;
}
|