zstu 2545 地道战

dfs。。一开始忘记了标记走过的路。。超时了。。

#include<stdio.h>
#include<string.h>
int min(int g,int h)
{
    return g>h?h:g;
}
struct ways
{
    int left;
    int down;
}map[110][110];
int way[110][110];
int n,m;
int dfs(int x,int y)
{
    if(x>n||y>m)
        return 0x3f3f3f3f;
    if(x==n&&y==m)
        return 0;
    if(way[x][y]>=0)
        return way[x][y];
    int ans=min(dfs(x+1,y)+map[x][y].down,dfs(x,y+1)+map[x][y].left);
    way[x][y]=ans;
    return ans;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(way,-1,sizeof(way));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m-1;j++)
            {
                scanf("%d",&map[i][j].left);
            }
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n-1;j++)
            {
                scanf("%d",&map[j][i].down);
            }
        int ans=dfs(1,1);
        printf("%d\n",ans);
    }
    return 0;
}

既然老师放在dp专题。。
那就装模作样写一下另一种写法吧。。

#include<stdio.h>
#include<string.h>
int min(int g,int h)
{
    return g>h?h:g;
}
struct ways
{
    int left;
    int down;
}map[110][110];
int dp[110][110];
int n,m;
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(dp,0x3f3f3f3f,sizeof(dp));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m-1;j++)
            {
                scanf("%d",&map[i][j].left);
            }
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n-1;j++)
            {
                scanf("%d",&map[j][i].down);
            }
        dp[1][1]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                if(i==1&&j==1)
                    continue;
                dp[i][j]=min(dp[i-1][j]+map[i-1][j].down,dp[i][j-1]+map[i][j-1].left);
            }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}

你可能感兴趣的:(DFS,dp-zstu)