【洛谷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 }

 

posted @ 2018-07-24 14:14  yjk  阅读(172)  评论(0编辑  收藏  举报