lightoj1004【基础DP】
从低端到顶端求个最大值;
思路:
基础DP,递推
#include<cstdio> #include<queue> #include<map> #include<string> #include<string.h> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const LL mod=1e9+7; int a[110][110]; int dp[110][110]; int main() { int T,cas=1; int n; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(a,0,sizeof(a)); for(int i=1;i<=2*n-1;i++) { if(i<=n) { for(int j=1;j<=i;j++) scanf("%d",&a[i][j]); } else { for(int j=1;j<=(2*n-i);j++) scanf("%d",&a[i][j]); } } memset(dp,0,sizeof(dp)); dp[1][1]=a[1][1]; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) dp[i][j]=a[i][j]+max(dp[i-1][j],dp[i-1][j-1]); for(int i=n+1;i<=2*n-1;i++) for(int j=1;j<=(2*n-i);j++) dp[i][j]=a[i][j]+max(dp[i-1][j],dp[i-1][j+1]); printf("Case %d: ",cas++); printf("%d\n",dp[2*n-1][1]); } return 0; }