P1005 矩阵取数游戏 java大数

题意:有n行数据,每行m个数字,对于这m个数字,我们可以选择在首部取数,或者在尾部取数

   取数获得的权值为该数*(2的i次方)  

   要求如何才能使结果最大

思路:n行数据可以独立开来,我们在计算的时候,分别对每一行进行dp即可,但是这道题会爆longlong

   所以得用大数做法(__int128)可以过

   我这里用java写了一发。

__int128代码如下:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int MAXN=81;
 6 
 7 inline void input(__int128 &s)
 8 {
 9     s=0;
10     char c=' ';
11     while(c>'9'||c<'0') c=getchar();
12     while(c>='0'&&c<='9')
13     {
14         s=s*10+c-'0';
15         c=getchar();
16     }
17 }
18 
19 inline void output(__int128 x)
20 {
21     if(x>9)
22         output(x/10);
23     putchar(x%10+'0');
24 }
25 
26 int n, m;
27 __int128 game[MAXN][MAXN];
28 
29 __int128 f[MAXN][MAXN];
30 __int128 solve(__int128 a[])
31 {
32     memset(f,0,sizeof(f));
33     for(int len=0;len<=m;++len)
34         for(int i=1;i+len<=m;++i)
35             f[i][i+len]=max(2*f[i+1][i+len]+2*a[i],2*f[i][i+len-1]+2*a[i+len]);
36     return f[1][m];
37 }
38 
39 __int128 ans=0;
40 int main()
41 {
42     cin>>n>>m;
43     for(int i=1;i<=n;i++)
44         for(int j=1;j<=m;j++)
45             input(game[i][j]);
46     for(int i=1;i<=n;i++)
47         ans+=solve(game[i]);
48     output(ans);
49     return 0;
50 }
View Code

java大数代码如下:

 1 import java.io.*;
 2 import java.util.*;
 3 import java.math.*;
 4 
 5 
 6 public class Main {
 7     public static void main(String[] args) {
 8         Scanner cin = new Scanner(System.in);
 9         int n,m;
10         n=cin.nextInt();
11         m=cin.nextInt();
12         BigInteger [][]a = new BigInteger[100][100];
13         BigInteger [][]dp = new BigInteger[100][100];
14         int tmp=0;
15         BigInteger ans = BigInteger.valueOf(tmp);
16         for(int i=1;i<=n;i++){
17             for(int j=1;j<=m;j++) {
18                 a[i][j] = cin.nextBigInteger();
19             }
20         }
21         BigInteger tmp2,tmp1,tmp3,judge1,judge2;
22         for(int k=1;k<=n;k++){
23             //初始化
24             for(int i=0;i<=m+2;i++)
25                 for(int j=0;j<=m+2;j++)
26                     dp[i][j]=BigInteger.valueOf(tmp);
27             for(int len=0;len<=m;len++){
28                 for(int i=1;i+len<=m;i++){
29                     int t=2;
30                     tmp2= BigInteger.valueOf(t);
31                     tmp1= dp[i+1][i+len].multiply(tmp2);
32                     tmp3= a[k][i].multiply(tmp2);
33                     judge1=tmp1.add(tmp3);
34                     tmp1=dp[i][i+len-1].multiply(tmp2);
35                     tmp3=a[k][i+len].multiply(tmp2);
36                     judge2=tmp1.add(tmp3);
37                     dp[i][i+len]=judge1.max(judge2);
38                 }
39             }
40             ans=ans.add(dp[1][m]);
41         }
42         System.out.println(ans);
43     }
44 
45 }
View Code

 

posted @ 2020-10-30 10:03  古比  阅读(215)  评论(0编辑  收藏  举报