网站谷歌优化怎么做,做网站赚钱还是做app赚钱,做钢材的网站,组织架构及营销网络城市交通
jzoj 1749
题目大意
有n个点#xff0c;x到y的前提是xy,代价是(y−x)∗axby(y-x)*a_xb_y(y−x)∗axby#xff0c;问从1到n的最小代价是多少
输入样例
4
2 9 5 4
9 1 2 2输出样例
8数据范围
对于20%的数据#xff0c;1⩽n⩽100#xff1b;1\leqslan…城市交通
jzoj 1749
题目大意
有n个点x到y的前提是xy,代价是(y−x)∗axby(y-x)*a_xb_y(y−x)∗axby问从1到n的最小代价是多少
输入样例
4
2 9 5 4
9 1 2 2输出样例
8数据范围
对于20%的数据1⩽n⩽1001\leqslant n\leqslant 1001⩽n⩽100 对于50%的数据1⩽n⩽30001\leqslant n\leqslant 30001⩽n⩽3000 对于100%的数据1⩽n⩽1000001⩽Ai,Bi⩽109。1\leqslant n\leqslant 1000001\leqslant Ai,Bi\leqslant 10^9。1⩽n⩽1000001⩽Ai,Bi⩽109。
解题思路
y要大于x就说明不能倒着走那就可以用DP来做 我们设fif_ifi为到从1到i的最小代价如果我们直接枚举从哪里来那时间复杂度就是o(n2)o(n^2)o(n2)那就会TLE 那我们考虑优化 我们可以用单调队列来存有用的状态 有用的状态i对比前面所有有用的状态j都必须满足以下两个条件之一 1:、aiaja_ia_jaiaj 2、bibjb_ib_jbibj 这样才可能使答案更优 后面的状态只须从有用的状态转移 当然这样还是可能被卡但数据太水A了
代码
#includecstdio
#includecstring
#includeiostream
#includealgorithm
#define ll long long
using namespace std;
ll n, w, p, a[100500], b[100500], f[100500], k[100500];
int main()
{scanf(%lld, n);for (ll i 1; i n; i)scanf(%lld, a[i]);for (ll i 1; i n; i)scanf(%lld, b[i]);memset(f, 127/3, sizeof(f));f[1] 0;k[w] 1;//有用的状态for (ll i 2; i n; i){p 1;for (int j 1; j w; j){f[i] min(f[i], f[k[j]] a[k[j]] * (i - k[j]) b[i]);//转移if (a[i] a[k[j]] b[i] b[k[j]]) p 0;//判断是否是有用的状态}if (p)k[w] i;//加入}printf(%lld, f[n]);return 0;
}注
这道题还可以用斜率优化做但本蒟蒻还要学习学习