社区讨论
T了两个点 求优化方法 玄关
P1005[NOIP 2007 提高组] 矩阵取数游戏参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @miha4ufs
- 此快照首次捕获于
- 2025/11/27 18:17 3 个月前
- 此快照最后确认于
- 2025/11/28 20:35 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 81;
string dp[maxn][maxn][maxn];
string a[maxn][maxn];
string lg[maxn];
bool cmp(string a,string b){
if(a.size() != b.size())return a.size()<b.size();
return a<b;
}
string Max(string x,string y){
if(cmp(x,y))return y;
return x;
}
string cheng(string x,string y){
int a[10005] = {},b[10005] = {},z[10005] = {};
for(int i = 0;i<x.size();i++)a[x.size()-i] = x[i]-'0';
for(int i = 0;i<y.size();i++)b[y.size()-i] = y[i]-'0';
int len = x.size()+y.size();
for(int i = 1;i<=x.size();i++){
for(int j = 1;j<=y.size();j++){
z[i+j-1]+=a[i]*b[j];
z[i+j]+=z[i+j-1]/10;
z[i+j-1]%=10;
}
}
while(z[len] == 0 && len>1)len--;
string c;
for(int i = len;i>=1;i--){
c+=to_string(z[i]);
}
return c;
}
string jia(string x,string y){
int a[1000] = {},b[1000] = {},z[1000] = {};
for(int i = 0;i<x.size();i++)a[x.size()-i] = x[i]-'0';
for(int i = 0;i<y.size();i++)b[y.size()-i] = y[i]-'0';
int len = max(x.size(),y.size());
for(int i = 1;i<=len;i++){
z[i]+=a[i]+b[i];
z[i+1]+=z[i]/10;
z[i]%=10;
}
if(z[len+1])len++;
string c;
for(int i = len;i>=1;i--){
c+=to_string(z[i]);
}
return c;
}
string qpow(string a,int b){
string ans = "1";
while(b>0){
if(b&1)ans = cheng(ans,a);
a = cheng(a,a);
b/=2;
}
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i = 0;i<=80;i++){
lg[i] = qpow("2",i);
}
string ans = "0";
for(int rd = 1;rd<=n;rd++){
for(int len = 1;len<=m;len++){
for(int i = 1;i+len-1<=m;i++){
int j = i+len-1;
dp[rd][i][j] = Max(jia(dp[rd][i][j-1],cheng(a[rd][j],lg[m-j+i])),jia(dp[rd][i+1][j],cheng(a[rd][i],lg[m-j+i])));
}
}
ans = jia(ans,dp[rd][1][m]);
}
cout<<ans;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...