算法1:区间DP
emmmm不想写高精度了,那就用__int128来代替吧。
对于__int128,只能在Linux的编译环境下使用。而且,cin和cout都是无法操作的。因此需要自己整一套快读快写的模板,如下:
C++ 代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
typedef __int128 LL;
LL s[MAXN];
int n;
LL f[MAXN][MAXN];
inline __int128 read(){
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void print(__int128 x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
print(x/10);
putchar(x%10+'0');
}
int main(){
cin >> n ;
for(int i=1;i<=n;i++){s[i]=read(); s[i+n]=s[i];}
memset(f,0x3f,sizeof f);
for(int len=1;len<=n;len++){
for(int i=1;i+len-1<=2*n;i++){
int l=i,r=len+i-1;
if(len<=2) f[l][r]=0;
else if(len==3) f[l][r]=s[l]*s[l+1]*s[l+2];
else
for(int k=l;k<=r;k++){
f[l][r]=min(f[l][r],f[l][k]+f[k][r]+s[l]*s[k]*s[r]);
}
}
}
LL u=1e31;
for(int i=1;i<=n;i++)
u=min(u,f[i][i+n-1]);
print(u);
return 0;
}
做到这题的时候就往题解去找看看int128能不能过。。2022年了真的不想写高精度了
大佬我想请教以下 为啥用y总的方法 只是换了个__int128就报错(样例都过不去)
呜呜呜呜呜之前都是老老实实写结构体板子(嘿嘿嘿嘿我要偷懒)
__int128要换一套自己写的输入输出的板子,正常的读入输出是不行的
我用了的 但是就是不行非得换成环形dp的写法 就是2 * n的这种
那你应该是模数的处理那里写的有问题
可以的,你f[l][r]赋的最大值的是不是小了