社区讨论

蜜汁WA~~~

P1005[NOIP 2007 提高组] 矩阵取数游戏参与者 5已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi6iczgp
此快照首次捕获于
2025/11/20 05:22
4 个月前
此快照最后确认于
2025/11/20 05:22
4 个月前
查看原帖
改了几天了,还是没改出来,5555~~~~~
求dalao改错。。。。
CPP
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define For(i , j , k) for (register int i = (j) , _##end_ = (k) ; i <= _##end_ ; ++ i)
#define Fordown(i , j , k) for (register int i = (j) , _##end_ = (k) ; i >= _##end_ ; -- i)
#define Set(a , b) memset(a , b , sizeof(a))
#define pb push_back
#define Mod (1000000007)
#define INF (0x3f3f3f3f)
#ifdef hany01
#define debug(...) fprintf(stderr , __VA_ARGS__)
#else
#define debug(...)
#endif
typedef long long LL;
using namespace std;

template <typename T> inline bool chkmax(T &a , const T &b) { return a < b ? a = b , 1: 0; }
template <typename T> inline bool chkmin(T &a , const T &b) { return b < a ? a = b , 1: 0; }

int _ , __;
char c_;
inline int Read()
{
    for (_ = 0,__ = 1,c_ = getchar();!isdigit(c_);c_=getchar())if (c_ == '-')__ = -1;
    for (;isdigit(c_);c_=getchar())_ = (_ << 1) + (_ << 3) + (c_ ^ 48);
    return _ * __;
}

inline void file()
{
#ifdef hany01
    freopen("prac.in" , "r" , stdin);
    freopen("prac.out" , "w" , stdout);
#endif
}

struct Number
{
    short len , a[60];

    void clear()
    {
        len = 0;
        Set(a , 0);
    }

    void inf()
    {
        len = 50;
        For(i , 1 , len)
            a[i] = 9;
    }

    Number X2()
    {
        Number A = *this;
        For(i , 1 , A.len)
            A.a[i] = A.a[i] * 2;
        For(i , 1 , A.len)
            A.a[i + 1] += A.a[i] / 10,
            A.a[i] %= 10;
        while (A.a[A.len + 1])
            ++ A.len;
        return A;
    }

    bool operator < (const Number A) const
    {
        if (len < A.len)
            return true;
        if (len > A.len)
            return false;
        Fordown(i , len , 1)
        {
            if (a[i] < A.a[i])
                return true;
            if (a[i] > A.a[i])
                return false;
        }
        return false;
    }

    void print()
    {
        if (!len)
            putchar('0');
        else
            Fordown(i , len , 1)
                printf("%d" , a[i]);
    }

}dp[100][100] , Ans , tmp , a[100][100] , Max;

Number operator + (const Number &A , const Number &B)
{
    Number C;
    C.clear();
    C.len = max(A.len , B.len);
    For(i , 1 , C.len)
        C.a[i + 1] += (A.a[i] + B.a[i]) / 10,
        C.a[i] += (A.a[i] + B.a[i]) % 10;
    while (C.a[C.len + 1])
        ++ C.len;
    return C;
}

Number Turn(int t)
{
    Number A;
    A.clear();
    if (!t)
        return A;
    while (t)
    {
        A.a[++ A.len] = t % 10;
        t /= 10;
    }
    return A;
}

int n , m;

int main()
{
    file();
    n = Read();
    m = Read();
    Ans.clear();
    For(T , 1 , n)
    {
        For(i , 1 , m)
        {
            a[i][1] = Turn(Read()).X2();
            For(j , 2 , m)
                a[i][j] = a[i][j - 1].X2();
        }
        dp[1][m].clear();
        Fordown(len , m - 1 , 1)
        {
            For(i , 1 , m - len + 1)
            {
                int j = i + len - 1;
                dp[i][j].clear();
                if (i > 1)
                    chkmax(dp[i][j] , dp[i - 1][j] + a[i - 1][m - len]);
                if (j < m)
                    chkmax(dp[i][j] , dp[i][j + 1] + a[j + 1][m - len]);
            }
        }
        Max.clear();
        For(j , 1 , m)
            chkmax(Max , dp[j][j] + a[j][m]);
        Ans = Ans + Max;
    }
    Ans.print();
    putchar('\n');
    return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...