4 条题解

  • 1
    @ 2025-11-1 10:31:39
    #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
      @ 2025-10-18 13:13:57
      #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
        @ 2023-12-16 14:10:15

        非常简单的动态规划

        #include<bits/stdc++.h>
        using namespace std;
        int main()
        {
          int n,i,j,a[105][105];
          cin>>n;
          for(i=1;i<=n;++i)
          for(j=1;j<=i;++j)
          cin>>a[i][j];
          for(i=n-1;i>=1;--i)//从第二行开始
          for(j=1;j<=i;++j)
          a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
          cout<<a[1][1];
          return 0;
        }
        
        • -2
          @ 2022-7-19 8:03:03

          动态规划初步 可以用逆推做

          #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
          上传者