P1005 [NOIP2007 提高组] 矩阵取数游戏

P1005 [NOIP2007 提高组] 矩阵取数游戏

题目输入输出

输入

2 3
1 2 3
3 4 2

输出

82

我寻思这不就是一道普普通通的dp吗,然后被500多亿大的数据给毒打了,高精度就涉及到我的知识盲区了 _int128 真是个神奇的东西, 不过需要手动输入输出一下

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int MAXN = 85;

__int128 v[MAXN][MAXN];
__int128 dp[MAXN][MAXN];

__int128 func(int l, int m){
    memset(dp, 0, sizeof(dp));
    __int128 ans = 0;
    for(int i = 0; i < m; i++){
        for(int j = m; j >= i; j--){
            int cnt = m - (j - i);
            if(i == 0)
                dp[i][j] = dp[i][j + 1] + (v[l][j] << cnt);
            else
                dp[i][j] = max(dp[i - 1][j] + (v[l][i - 1] << cnt), dp[i][j + 1] + (v[l][j] << cnt));
        }
        if(dp[i][i] > ans)
            ans = dp[i][i];
    }
    return ans;
}
inline void input(__int128 &s)
{
    s=0;
    char c=' ';
    while(c>'9'||c<'0') c=getchar();
    while(c>='0'&&c<='9')
    {
        s=s*10+c-'0';
        c=getchar();
    }
}
inline void output(__int128 x)
{
    if(x>9)
        output(x/10);
    putchar(x%10+'0');
}
int main(){
    int m, n;
    cin >> n >> m;
    memset(v, 0, sizeof(v));
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            input(v[i][j]);
        }
    }
    __int128 ans = 0;
    //memset(dp, 0, sizeof(dp));
    
    for(int i = 0; i < n; i++){
        ans += func(i, m);
    }
    output(ans);
    return 0;
}
原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14627406.html