一杯茶一包烟,高精bug修一天
查看原帖
一杯茶一包烟,高精bug修一天
1347427
st_hs楼主2024/4/25 13:48

dp+高精

再强行AC高精度的题我是狗

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int ans[310],a[85][85],f[85][85][310],pow2[83][310],n,m;
void multiplyLN(int a, int *b, int *c) {
    int carry = 0;
    int product;  
    int bLength = b[0]; 
 	memset(c,0,200);
 	if(a==0 || b[0]==0) return;
    for (int i = 1; i <= b[0] + 10; ++i) {
        c[i] = 0;
    }
	
    for (int i = 1; i <= bLength; ++i) {
        product = a * b[i] + carry;
        c[i] = product % 10; 
        carry = product / 10; 
    }

    int index = bLength + 1;
    while (carry > 0) {
        c[index] = carry % 10;
        carry /= 10;
        index++;
    }

    c[0] = index - 1;
    if(c[1]==0 && c[0]==1) c[0]=0;
} 

void copyLN(int *a,int *b)
{
	for(int i=1;i<=b[0];i++)
	a[i]=b[i];
	for(int i=b[0]+1;i<=a[0];i++)
	a[i]=0;
	a[0]=b[0];
}

void maxLN(int *a,int *b)
{
	if(b[0]==0) return;
	if(a[0]<b[0]) {
		copyLN(a,b);
		return;
	}
	for(int i=a[0];i>=1;i--)
	if(a[i]==b[i]) continue;
	else{
		if(a[i]<b[i])copyLN(a,b);
		return;
	}  	 
}

void plusLN(int *a,int *b)
{
	if(b[0]==0) return;
	for(int i=1;i<=a[0];i++)
	{
		if(i>b[0]) break;
		a[i]+=b[i];
	}
	if(a[0]<b[0]){
		for(int i=a[0]+1;i<=b[0];i++)
		a[i]=b[i];
		a[0]=b[0];
	}
	for(int i=1;i<=a[0];i++)
	{
		a[i+1]+=a[i]/10;
		a[i]=a[i]%10;
	}
	if(a[a[0]+1]!=0) a[0]++;
	if(a[1]==0 && a[0]==1) a[0]=0;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	cin>>a[i][j];	
	
	pow2[1][0]=1;
	pow2[1][1]=2;
	for(int i=2;i<=80;i++)
	multiplyLN(2,&pow2[i-1][0],&pow2[i][0]);
	
	for(int k=1;k<=n;k++)
	{
		int maxf1[310]={0},maxf2[310]={0},maxf[310]={0};
		memset(f,0,sizeof(f));
		for(int i=1;i<=m+1;i++)
		for(int j=m;j>=0;j--)
		{
			multiplyLN(a[k][i-1],&pow2[i+m-j-1][0],maxf1);
			multiplyLN(a[k][j+1],&pow2[i+m-j-1][0],maxf2);
			plusLN(maxf1,&f[i-1][j][0]);
			plusLN(maxf2,&f[i][j+1][0]);
			maxLN(&f[i][j][0],maxf1);
			maxLN(&f[i][j][0],maxf2);
			if(i-j==1) {
				maxLN(maxf,&f[i][j][0]);
				break;
			}
		}
		plusLN(ans,maxf);
	}
	for(int i=ans[0];i>=1;i--)
	cout<<ans[i];
	if(ans[0]==0) cout<<0;
}
2024/4/25 13:48
加载中...