【洛谷P1005】矩阵取数游戏

本文分享了一道关于矩阵取数的游戏问题的解决方案,通过区间动态规划(DP)解决,并使用高精度计算处理大数值,避免溢出问题。文章详细介绍了代码实现过程,包括初始化、状态转移方程及最终结果输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

矩阵取数游戏

题目链接

每行分别跑一趟区间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 }

 

转载于:https://www.cnblogs.com/yjkhhh/p/9359673.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值