代码耗时1100ms+
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
const int MAXN = 55, MAXM = 35;
vector<int> f[MAXN][MAXN];
int w[MAXN];
int n;
vector<int> add(vector<int>& a, vector<int>& b)
{
if (a.size() < b.size()) return add(b, a);
vector<int> c;
int t = 0;
for (int i = 0; i < (int)a.size(); ++i)
{
t += a[i];
if (i < (int)b.size()) t += b[i];
c.push_back(t % 10);
t /= 10;
}
if (t) c.push_back(t);
return c;
}
vector<int> mul(vector<int>& a, int b)
{
vector<int> c;
LL t = 0;
for (int i = 0; i < (int)a.size() || t; ++i)
{
if (i < (int)a.size()) t += (LL)a[i] * b;
c.push_back(t % 10);
t /= 10;
}
return c;
}
bool cmp(vector<int>& a, vector<int>& b)
{
if (a.size() != b.size()) return a.size() > b.size();
int i = (int)a.size() - 1;
while (a[i] == b[i] && i > 0) --i;
return a[i] > b[i];
}
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i) cin >> w[i];
vector<int> tmp;
for (int len = 3; len <= n; ++len)
{
for (int l = 1; l + len - 1 <= n; ++l)
{
int r = l + len - 1;
f[l][r] = vector<int>(MAXM, 1);
for (int k = l + 1; k < r; ++k)
{
tmp.clear();
tmp.push_back(w[l]);
tmp = mul(tmp, w[k]), tmp = mul(tmp, w[r]);
tmp = add(tmp, f[l][k]), tmp = add(tmp, f[k][r]);
if (cmp(f[l][r], tmp))
f[l][r] = tmp;
}
}
}
for (int i = f[1][n].size() - 1; i >= 0; --i)
{
cout << f[1][n][i];
}
cout << endl;
}
怎么说呢 这一题的最大亮点就在于如何处理高精度 题解最大的亮点在于vector[HTML_REMOVED] f[MAXN][MAXN];bool cmp(vector[HTML_REMOVED]& a, vector[HTML_REMOVED]& b) 特别是判断非常的经典和简洁
%%%%%%%%%%%%%%%
cmp函数这样写为啥不行
这样写可以啊
tmp.push_back(w[l]); 这里应该需要将w[i]的每一位倒序插入,,,这里只正序插入,为啥结果也是对的
这里为什么a.size()要强转为int
因为a,size不是int型的
请问一下读入vector为什么不需要%10来一位一位的push_back呢
你好,请问是对哪里的代码有这个疑问呢?
请问就是主函数中tmp.push_back(w[l])不需要一位一位从高到低读入vector吗
确实正常操作的话,我们需要一位一位的从高到低读入vector,但是我们后面有调用
add
和mul
函数,这两个函数会将你没有分解,直接push_back
到tmp
中的数给分解的,所以前面我就偷懒啦。两种做法都是可行的:)好的,谢谢你:)
处处坑啊
哈哈,多踩踩坑,记忆深刻些:)