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 }
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 }