NC16645(矩阵取数游戏 )

感受

思路





#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 100000 + 10;
inline __int128 read(){
    __int128 x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
inline void print(__int128 x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9) print(x / 10);
    putchar(x % 10 + '0');
}
__int128 dp[100][100][100];///dp[l][r] 表示剩余[l, r]的最大值
int a[100][100];
int n, m;
__int128 f[100], ans;
void init(){
    f[0] = 1;
    for(int i = 1; i <= m; i++){
        f[i] = f[i - 1] * 2;
    }
}
__int128 get(int x){
    for(int len = m - 1; len >= 1; len--){
        for(int l = 1, r; ; l++){
            r = l + len - 1;
            if(r > m) break;
            if(l > 1) dp[x][l][r] = dp[x][l - 1][r] + (__int128)1 * a[x][l - 1] * f[m - len];
            if(r < m) dp[x][l][r] = max(dp[x][l][r], dp[x][l][r + 1] + (__int128)1 * a[x][r + 1] * f[m - len]);
        }
    }
    __int128 tmp = 0;
    for(int i = 1; i <= m; i++) tmp = max(tmp, dp[x][i][i] + (__int128)1 * a[x][i] * f[m]);
    return tmp;
}
int main(){
    scanf("%d%d", &n, &m);
    init();
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            scanf("%d", &a[i][j]);
        }
        ans += get(i);
    }
    print(ans);
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:58
点赞 评论 收藏
分享
找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
06-07 12:20
新余学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务