4 条题解
-
1
#include<bits/stdc++.h> using namespace std; int a[1100][1100],f[1100][1100],n; int max(int x,int y) { return x>y?x:y; } int main() { cin>>n; for(int i=1; i<=n; i++)for(int j=1; j<=i; j++)cin>>a[i][j]; f[1][1]=a[1][1]; for(int i=2; i<=n; i++) { for(int j=1; j<=i; j++) { if(j==1) { f[i][j]=f[i-1][j]+a[i][j]; } else if(j==i){ f[i][j]=f[i-1][j-1]+a[i][j]; } else f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; } } int ans=INT_MIN; for(int i=1; i<=n; i++)ans=max(ans,f[n][i]); cout<<ans; return 0; } /* 1 2 1+2 3 1+3 2+3 1+2+3 */ -
0
#include<bits/stdc++.h> using namespace std; long long n,m,f[1000][1000],a[1000][1000]; long long fb(long long x,long long y) { if(y>x) return 0; if(x==n) return a[x][y]; else { if(f[x][y]==0) { long long t1=fb(x+1,y); long long t2=fb(x+1,y+1); f[x][y]=max(t1,t2)+a[x][y]; } return f[x][y]; } } int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cin>>a[i][j]; } } cout<<fb(1,1); } -
-2
动态规划初步 可以用逆推做
#include<bits/stdc++.h>
using namespace std;
long n,a[1005][1005],i,j,ma,f[1005][1005];
long read()//快读
{
long x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x10+(ch-'0'); ch=getchar(); } return xf;}
void write(long x)
{//快输 if(x<0){
putchar('-'); write(-x); return; } if(x>=10)write(x/10); putchar(x%10+'0');}
int main()
{ n=read();
for(i=1;i<=n;i++) for(j=1;j<=i;j++) a[i][j]=read();//输入 for(i=n;i>0;i--) for(j=1;j<=i;j++) { ma=a[i][j]+max(f[i+1][j],f[i+1][j+1]);//加上下一层的正下的下右 f[i][j]=max(f[i][j],ma); //找最大 } write(f[1][1]);//输出第一层第一个 return 0;}
- 1
信息
- ID
- 22
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 166
- 已通过
- 108
- 上传者