《算法进阶指南》--斜率优化-任务安排1
常规思路:f[i][j]表示前i个任务被分为了j个批次,转移时枚举f[x]j-1时间复杂度为O(n^3)。使用“费用提前计算”的思想,需要发现可以提出s,将其对总结果的答案加入f[i],状态表示上就不需要被分了j个批次这一层
int n, s;
int t[5003], c[5003];
int dp[5003];
int pret[5003], prec[5003];
void solve()
{
cin >> n >> s;
for (int i = 1; i <= n; i++)
{
cin >> t[i] >> c[i];
pret[i] = pret[i - 1] + t[i];
prec[i] = prec[i - 1] + c[i];
}
for (int i = 1; i <= n; i++)
{
int minn = INF;
for (int j = 0; j < i; j++)
{
minn = min(minn, dp[j] + s * (prec[n] - prec[j]) + (pret[i] * (prec[i] - prec[j])));
}
dp[i] = minn;
}
cout << dp[n] << endl;
}
收获:
当某一层状态对答案的影响不受后续状态影响,可以将费用提前计算,省去一维的状态计算

浙公网安备 33010602011771号