ps:这道题...是DP题..所以我去看了百度一些东西,才知道了什么是状态方程,状态转移方程..

做的第一个DP题,然后TLE一次。贴上TLE的代码:

#include "stdio.h"
int a[110][110];
int d(int i,int j,int n){
    if(i==n) return a[i][j]+0;
    if(d(i+1,j,n)>d(i+1,j+1,n)){
        return a[i][j]+d(i+1,j,n);    
    }
    else{
        return a[i][j]+d(i+1,j+1,n);
    }
    //return a[i][j]+(i==n?0:d(i+1,j,n)>?d(i+1,j+1,n));
}
int main(){
    int i,j,n,C;
    scanf("%d",&C);
    while(C--){
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            for(j=1;j<=i;j++){
                scanf("%d",&a[i][j]);
            }
        }
        printf("%d\n",d(1,1,n));
        
    }
    return 0;
}

因为重复计算得太多,超时了.

后来看了一些大神写的,可以用记忆化搜索..名字就特别有逼格..然后就写了下面这个.

   建立一个d数组来存每次计算过的值,就不用重复计算了.

代码:

#include "stdio.h"
#include "string.h"
int a[110][110];
int d[110][110];
int dd(int i,int j,int n){
    if(i==n) return a[i][j]+0;
    if(d[i][j]>=0) return d[i][j];
    if(dd(i+1,j,n)>dd(i+1,j+1,n)){
        return d[i][j]=a[i][j]+dd(i+1,j,n);
    }
    else{
        return d[i][j]=a[i][j]+dd(i+1,j+1,n);
    }
}
int main(){
    int C,i,j,n;
    scanf("%d",&C);
    while(C--){
        scanf("%d",&n);
        memset(d,-1,sizeof(d));
        for(i=1;i<=n;i++){
            for(j=1;j<=i;j++){
                scanf("%d",&a[i][j]);
            }
        }
        printf("%d\n",dd(1,1,n));
    }
    return 0;
}

果然AC了..

哦对了,刚开始做的一个,借用了网上大神的“>?"这个使用,然而在杭电里面无论是GCC还是G++都不支持这个

">?"这个是取两个的最大值,相当于max(a,b)  a>?b