P1005 矩阵取数游戏
Posted $mathcal{Lance1ot}$
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1005 矩阵取数游戏相关的知识,希望对你有一定的参考价值。
高精度真好van
假的
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node//高精度结构体
{
int len;
int base[101];
void fill(int val)//初始化函数,每次写高精度,都感觉自己是一点点凑出来的233
{
memset(base,0,sizeof(base));
len=0;
if(!val)
return ;
while(val>=10000)
{
base[len++]=val%10000;
val/=10000;//压一个小位
}
len-=1;
if(val)
base[++len]=val;
return ;
}
node operator + (const node &a)const//普通的加号
{
node res;
res.fill(0);//普通的调用
res.len=max(len,a.len);
for(int i=0;i<=res.len;i++)
{
res.base[i]+=base[i]+a.base[i];
res.base[i+1]+=res.base[i]/10000;
res.base[i]%=10000;//普通的压位
}
if(res.base[len+1])
res.len+=1;
while(!res.base[res.len])
res.len-=1;//普通且冗杂的调整尾数
if(res.len==-1)
res.len=0;
return res;
}
node operator * (const node &a)const
{
node res;
res.fill(0);
res.len=len+a.len;
for(int i=0;i<=len;i++)
for(int j=0;j<=a.len;j++)
{
res.base[i+j]+=base[i]*a.base[j];
res.base[i+j+1]+=res.base[i+j]/10000;
res.base[i+j]%=10000;
}
if(res.base[res.len+1])
res.len+=1;
while(!res.base[res.len])
res.len-=1;
if(res.len==-1)
res.len=0;
return res;
}
};
node max(const node &a,const node &b)
{
if(a.len!=b.len)
return (a.len > b.len ? a : b );
for(int i=a.len;i>=0;i--)
if(a.base[i]!=b.base[i])
return (a.base[i] > b.base[i] ? a : b);
return a;//比较大小
}
node twi[81];
int base[1010];
node dp[90][90];
node ans;
node pas;
node pas1,pas2;
int main()
{
twi[0].fill(1);
twi[1].fill(2);
for(int i=2;i<=80;i++)
twi[i]=twi[i-1]*twi[1];//预处理2的幂
int n,m;
scanf("%d%d",&n,&m);
ans.fill(0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%d",&base[j]);
pas.fill(base[1]);dp[1][0]=pas*twi[1];
pas.fill(base[m]);dp[0][1]=pas*twi[1];
for(int k=2;k<=m;k++)
for(int j=0;j<=k;j++)
{
pas1.fill(base[m-(k-j)+1]);
pas2.fill(base[j]);
dp[j][k-j].fill(0);
if(k-j-1>=0)
dp[j][k-j]=max(dp[j][k-j-1]+pas1*twi[k],dp[j][k-j]);
if(j-1>=0)
dp[j][k-j]=max(dp[j-1][k-j]+pas2*twi[k],dp[j][k-j]);//简单的dp
}
pas.fill(0);
for(int j=0;j<=m;j++)
pas=max(pas,dp[j][m-j]);
ans=ans+pas;
}
printf("%d",ans.base[ans.len]);
for(int i=ans.len-1;i>=0;i--)
printf("%04d",ans.base[i]);//一定要补位!!!
return 0;
}
以上是关于P1005 矩阵取数游戏的主要内容,如果未能解决你的问题,请参考以下文章