1 条题解
-
0
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
- 上传者