【洛谷P1005】矩阵取数游戏
矩阵取数游戏
每行分别跑一趟区间DP即可
这道题区间DP是非常裸的,按套路来即可
但是很毒瘤的是需要高精度,
“我王境泽就是爆零,从这跳下去,也不会用__int128的!”
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define int __int128 //真香 6 #define reset(a) memset(a,0,sizeof(a)) 7 #define N 85 8 int n,m,a[N],ans,f[N][N]; 9 int b[N]; 10 inline int read(){ 11 int x=0; char c=getchar(); 12 while(c<'0'||c>'9') c=getchar(); 13 while('0'<=c&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } 14 return x; 15 } 16 inline void print(int x){ 17 if(x>9) print(x/10); 18 putchar(x%10+'0'); 19 } 20 #undef int 21 int main() 22 #define int __int128 23 { 24 n=read(); m=read(); 25 b[0]=1; 26 for(int i=1;i<=m;i++) 27 b[i]=b[i-1]<<1; 28 for(int i=1;i<=n;i++){ 29 for(int j=1;j<=m;j++) 30 a[j]=read(); 31 reset(f); 32 for(int len=m-1;len>=1;len--) 33 for(int l=1;l+len-1<=m;l++){ 34 int r=l+len-1,&d=f[l][r]; 35 int t=b[m-len]; 36 d=f[l][r+1]+a[r+1]*t; 37 d=max(d,f[l-1][r]+a[l-1]*t); 38 } 39 int maxx=0; 40 for(int i=1;i<=m;i++) 41 maxx=max(maxx,f[i][i]+a[i]*b[m]); 42 ans+=maxx; 43 } 44 print(ans); 45 return 0; 46 }