洛谷P1005 矩阵取数游戏

也是从这里开始更会写高精度运算了。
贪心算法和dp很简单,只是加上了高精度而已。

#include <iostream>
#include <algorithm>
#include <cstring>
#define mem(_x) memset(_x,0,sizeof(_x))
#define fs(_x,_y) for(int _x=1;i<=_y;_x++)
#define fb(_x,_y) for(int _x=_y;_x;_x--)
using namespace std;
int a[81][100],s[100],tmp[3][100],f[81][81][100];
void carry(int* x){
    fs(i,x[0]){
        x[i+1]+=x[i]/10;x[i]%=10;
        while(x[x[0]+1])x[0]++;
    }
}
void evai(int i,int* x){
    if(!i)x[0]=1;
    while(i){
        x[0]++;
        x[x[0]]=i%10;
        i/=10;
    }
}
void highplus(int* x,int* y,int* z){
    z[0]=max(x[0],y[0]);
    fs(i,z[0])z[i]=x[i]+y[i];
    carry(z);
}
bool highmax(int* x,int* y){
    if(x[0]!=y[0])return x[0]>y[0];
    else fb(i,x[0]){
        if(x[i]>y[i])return 1;
        else if(x[i]<y[i])return 0;
    }
    return false;
}
void higheva(int* x,int* y){
    fs(i,x[0])y[i]=x[i];
    y[0]=x[0];
} 
void times(int* x){
    fs(i,x[0])x[i]<<=1;
    carry(x);
}
int main(void){
    int x,n,m,g,bg,j;
    cin>>n>>m;
    fs(i,n){
        for(j=1;j<=m;j++){cin>>x;evai(x,a[j]);evai(x<<1,f[j][j]);}
        for(j=1;j<=m;j++)for(int k=1;(g=k+j)<=m;k++){
            highplus(f[k+1][g],a[k],tmp[1]);highplus(f[k][g-1],a[g],tmp[2]);
            times(tmp[bg=(highmax(tmp[1],tmp[2])?1:2)]);
            if(highmax(tmp[bg],f[k][g]))higheva(tmp[bg],f[k][g]);
            mem(tmp);
        }
        highplus(f[1][m],s,s);
        mem(f);mem(a);
    }
    fb(i,s[0])cout<<s[i];
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值