NC16645(基础区间dp+高精度)

https://ac.nowcoder.com/acm/problem/16645

这道题唯一需要注意的就是高精度了吧……
思路很简单,首先发现可以每行单独处理,用dp[l,r]表示选择lr区间内的最大收益,有公式
图片说明
然后就在n2内处理一行,n3处理整个矩阵即可。
值得一提的是高精度__int128不能在一般编译器上跑……并且它不支持cincout,需要自己准备io函数。

#include<bits/stdc++.h>
using namespace std;

const int maxn=81;
__int128 dp[maxn][maxn],ans;
int a[maxn][maxn];

inline void write(__int128 x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
}
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;
}

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            a[i][j]=read();
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            dp[j][j]=a[i][j];
        for(int l=2;l<=m;l++){
            for(int k=1;k+l-1<=m;k++){
                dp[k][k+l-1]=max(dp[k][k+l-2]*2+a[i][k+l-1],dp[k+1][k+l-1]*2+a[i][k]);
            }
        }
        ans+=dp[1][m]*2;
    }
    write(ans);
}
每日一题 文章被收录于专栏

暑期每日一题,尽量日更

全部评论

相关推荐

KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务