1 条题解
-
0
知识点:动态规划
这是一个区间问题 从题目描述我们可以知道行与行之间没有联系 于是我们可以设为某一行范围内所得值最大的取值方法 于是转移状态就出来了 取数变成了向这个区间加数 加的数为下次第一个取的 则有转移方程 ,;
#include <bits/stdc++.h> #define ll __int128 #define endl '\n' using namespace std; ll n, m, a[110], ans, dp[110][110]; inline ll read() { ll x = 0, neg = 1; char op = getchar(); while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar();} while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); } return neg * x; } inline void print(ll x) { if (x < 0) { putchar('-'); x = -x; } if (x >= 10) print(x / 10); putchar(x % 10 + '0'); } void Solve(){ n = read(); m = read(); for(int i = 1; i <= n; ++i){ for(int j = 1; j <= m; ++j){ a[j] = read(); } for(int len = 1; len <= m; ++len){ for(int l = 1; l+len-1 <= m; ++l){ int r = l+len-1; if (len == 1) dp[l][r] = a[l]*2; else dp[l][r] = max((dp[l+1][r]+a[l])*2, (dp[l][r-1]+a[r])*2); ///向区间两边加的数为第一个取的 } } ans += dp[1][m]; } print(ans); return ; } int main(){ int T = 1; // cin >> T; while(T--){ Solve(); } return 0; }
信息
- ID
- 190
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 14
- 已通过
- 3
- 上传者