1 条题解

  • 0
    @ 2023-3-13 11:09:04

    C :

    #include<stdio.h>
    #define max(a,b)	(a>b?a:b)
    int m,n;
    int a[110][110],b[110][110],ans[1111],cnt;
    int main()
    {
    	scanf("%d %d",&m,&n);
    	for(int i=1;i<=m;i++)
    	for(int j=1;j<=n;j++)
    	scanf("%d",&a[i][j]);
    	for(int i=1;i<=m;i++)
    	for(int j=1;j<=n;j++)
    	b[i][j]=max(b[i-1][j],b[i][j-1])+a[i][j];
    	int x=m,y=n;
    	do
    	{
    		if(x==1&&y==1)
    		{
    			ans[++cnt]=a[1][1];
    			break;
    		}
    		ans[++cnt]=a[x][y];
    		if(b[x-1][y]+a[x][y]==b[x][y])
    		x--;
    		else
    		y--;
    	}while(1);
    	for(int i=cnt;i>=1;i--)
    	{
    		printf("%d",ans[i]);
    		if(i!=1)
    		printf("-");
    	}
    	return 0;
    }
    

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){ 
    	int n,m,i,j,k;//n行,m列 
    	int a[110][110] = {0};
    	int b[110][110] = {0}; 
    	//存放路径 
    	int r[10010] = {0};
    	
    	cin>>n>>m;
    	for(i = 1;i <= n;i++){
    		for(j = 1;j <= m;j++){
    			cin>>a[i][j];
    		}
    	} 
    	
    	//算出走到每个点,最多能摘到的花生 
    	for(i = 1;i <= n;i++){
    		for(j = 1;j <= m;j++){
    			b[i][j] = a[i][j];//记录原始数据 
    			a[i][j] = a[i][j] + max(a[i][j-1],a[i-1][j]);
    		}
    	}
    	
    	//第一个点是已知点 
    	r[1] = b[n][m];//最后一个点的值
    	k = 2;//第二个点开始探索 
    	int x = n;
    	int y = m;
    	//截止到1 1点结束 
    	while(x != 1 || y != 1){
    		//如果上面的大说明从上面来,否则从左边来 
    		if(b[x-1][y] > b[x][y-1]){
    			r[k] = b[x-1][y];
    			x--;
    		} else{
    			r[k] = b[x][y-1];
    			y--;
    		}
    		k++;
    	} 
    	
    	//逆序输出结果
    	for(i = k-1;i >= 1;i--){
    		if(i != 1){
    			cout<<r[i]<<"-";
    		}else{
    			cout<<r[i]<<endl;
    		}
    	} 
    }
    

    Python :

    sr=input().split()
    m=int(sr[0])
    n=int(sr[1])
    a=[[0 for i in range(n)] for j in range(m)]
    f=[[0 for i in range(n+2)] for j in range(m+2)]
    b=[]
    for i in range(m):
        sr=input().split()
        for j in range(n):
            a[i][j]=int(sr[j])
    s=str(a[0][0])
    for i in range(m):
        for j in range(n):
            f[i+1][j+1]=max(f[i-1+1][j+1],f[i+1][j-1+1])+a[i][j]
    s=""
    i=m
    j=n
    s=str(a[i-1][j-1])
    while(not(i==1 and j==1)):
        if(f[i-1][j]>f[i][j-1]):
            s=str(a[i-1-1][j-1])+"-"+s
            i=i-1
        else:
            s=str(a[i-1][j-1-1])+"-"+s
            j=j-1
    print(s)
    
    
    • 1

    信息

    ID
    1630
    时间
    1000ms
    内存
    16MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者