参考代码1:(时间超限,用path数组记录路径的DFS)

#include <stdio.h>
#include <stdlib.h>

int map[100][100];
int visited[100][100];
typedef struct {
    int i;
    int j;
}node;
node path[101];
int pt=0;
int max=-1;
int n;

void dfs(int i,int j)
{
    path[pt].i=i;path[pt].j=j;++pt;
    visited[i][j]=1;
    if(i==n-1)
    {
        int k,sum=0;
        for(k=0;k<pt;k++)
            {sum+=(map[path[k].i][path[k].j]);}
        if(sum>max) max=sum;
        return;
    }

    if(i<n-1&&!visited[i+1][j])
        {dfs(i+1,j);--pt;visited[i+1][j]=0;}

    if(i<n-1&&j<n-1&&!visited[i+1][j+1])
        {dfs(i+1,j+1);--pt;visited[i+1][j+1]=0;}
}

int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t&&scanf("%d",&n))
    {
        for(i=0;i<n;i++)
            for(j=0;j<=i;j++)
                {scanf("%d",map[i]+j);visited[i][j]=0;}

        dfs(0,0);
        printf("%d\n",max);
        t--;
    }
    return 0;
}




参考代码2:(输出超限(运行时间过长),DFS)

#include <stdio.h>
#include <stdlib.h>

int map[100][100];
int visited[100][100];
int max,sum;
int n;

void dfs(int i,int j)
{
    visited[i][j]=1;
    sum+=map[i][j];
    if(i==n-1)
    {
        if(sum>max) max=sum;
        return;
    }
    if(i<n-1&&!visited[i+1][j])
        {dfs(i+1,j);sum-=map[i+1][j];visited[i+1][j]=0;}

    if(i<n-1&&j<n-1&&!visited[i+1][j+1])
        {dfs(i+1,j+1);sum-=map[i+1][j+1];visited[i+1][j+1]=0;}
    return;
}

int main()
{
    int t,i,j,k=0;
    scanf("%d",&t);
    while(t&&scanf("%d",&n))
    {
        max=-1;sum=0;
        for(i=0;i<n;i++)
            for(j=0;j<=i;j++)
                {scanf("%d",map[i]+j);visited[i][j]=0;}

        dfs(0,0);
        printf("%d\n",max);
        t--;
    }
    return 0;
}


参考代码3:AC(动态规划)

#include <stdio.h>
#include <string.h>

int Max(int a, int b)
{
    return a>b?a:b;
}

int main()
{
    int n,i,j,m;
    int num[105][105]={0};
    int dp[105][105]={0};

    scanf("%d",&n);
    while(n)
    {
        scanf("%d",&m);
        for(i=0; i<m; i++)
            for(j=0; j<=i; j++)
                scanf("%d",&num[i][j]);
        for(j=0;j<m;j++)
            dp[m-1][j]=num[m-1][j];
        for(i=m-2; i>=0; i--)
            for(j=0; j<=i; j++)
                dp[i][j]=Max(dp[i+1][j],dp[i+1][j+1])+num[i][j];

        printf("%d\n",dp[0][0]);
        memset(num,0,sizeof(num));
        memset(dp,0,sizeof(dp));
        n--;
    }
    return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论