TYVJ1264
水题
裸数字三角形,稍微升级
从下游往上推
设dp[i][j]表示到达(i,j)时所能得到的最大分数
目标dp[1][j]中的最大值
方程:
dp[i][j] = a[i][j]+max(dp[i+1][j-1],dp[i+1][j],dp[i+1]
[j+1])
特殊情况加特判即可
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 8001; 8 const int maxm = 1001; 9 int a[maxn][maxm]; 10 int main() 11 { 12 freopen("in.txt","r",stdin); 13 int n,m; 14 cin>>m>>n; 15 for(int i = 1;i<=n;++i) 16 for(int j = 1;j<=m;++j) 17 scanf("%d",&a[i][j]); 18 for(int i = n-1;i>=1;--i) 19 for(int j = 1;j<=m;++j)if(a[i][j]!=-1) 20 { 21 if(j==1)a[i][j]+=max(a[i+1][j],a[i+1][j+1]); 22 else if(j==m)a[i][j]+=max(a[i+1][j],a[i+1][j-1]); 23 else a[i][j]+=max(a[i+1][j],max(a[i+1][j-1],a[i+1][j+1])); 24 } 25 int ans = -1; 26 for(int i = 1;i<=m;++i) 27 ans=max(ans,a[1][i]); 28 printf("%d\n",ans); 29 30 return 0; 31 }
弱者究竟为何而战?!