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
时间: 2024-10-13 14:19:21