1 条题解

  • 0
    @ 2025-3-8 20:48:41

    知识点:动态规划

    这是一个区间dpdp问题 从题目描述我们可以知道行与行之间没有联系 于是我们可以设dp[i][j]dp[i][j]为某一行iji-j范围内所得值最大的取值方法 于是转移状态就出来了 取数变成了向这个区间加数 加的数为下次第一个取的 则有转移方程 ifif len==1len==1 dp[l][r]=a[l]2dp[l][r]=a[l] * 2 elseelse dp[l][r]=max((dp[l+1][r]+a[l])2dp[l][r]=max((dp[l+1][r]+a[l])*2,(dp[l][r1]+a[r])2)(dp[l][r-1]+a[r])*2);

    #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
    上传者