首先可以判断这是一个dp,然后这个矩阵中各个行之间是没有联系的,所以可以一行一行地求出最优解然后通过循环加起来
不是一个特别难的dp 但是在数目问题上比较大 反正一看到平方啊这种东西应该差不多会溢出的……所以写一个高精度的结构体 就ok了!!
代码在这:
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int maxn=85;
int n,m;
int temp[maxn][maxn];
const int power=4;
const int base=10000;
const int maxl=35;
struct num{
int a[maxl];
num(){
memset(a,0,sizeof(a));
}
num operator + (const num &b){
num c;
c.a[0]=max(a[0],b.a[0]);
for(int i=1;i<=c.a[0];++i){
c.a[i]+=a[i]+b.a[i];
c.a[i+1]+=c.a[i]/base;
c.a[i]=c.a[i]%base;
}
if(c.a[c.a[0]+1]) ++c.a[0];
return c;
}
num operator + (const int &b){
a[1]+=b;
int i=1;
while(a[i]>=base){
a[i+1]+=a[i]/base;
a[i]%=base;
i++;
}
while(a[a[0]+1]) ++a[0];
return *this;
}
num operator = (int b){
a[0]=0;
while(b){
a[0]++;
a[a[0]]=b%base;
b/=base;
}
return *this;
}
bool operator < (const num &b)const{
if(a[0]<b.a[0]) return true;
if(a[0]>b.a[0]) return false;
for(int i=a[0];i>0;--i)
if(a[i]!=b.a[i]) return a[i]<b.a[i];
return false;
}
void print(){
printf("%d",a[a[0]]);
for(int i=a[0]-1;i>0;--i)
printf("%0*d",power,a[i]);
printf("\n");
}
}ans,s[maxn][maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&temp[i][j]);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
s[j][j]=temp[i][j];
int x;
for(int j=1;j<=m-1;++j)
for(int k=1;k<=m-j;++k){
x=k+j;
s[k][x]=max(s[k][x-1]+s[k][x-1]+temp[i][x],s[k+1][x]+s[k+1][x]+temp[i][k]);
}
ans=ans+s[1][m];
ans=ans+s[1][m];
}
ans.print();
return 0;
}