分析
这第一眼看上去一定是一个动态规划题,因为要输出最xx的80%的题是动态规划。仔细思考,这是一个01背包,只不过多了个不能偷的条件。我用f[i]表示检测到第i个物品需要的最少花费。那么,有两种状态转移方程:
- 这个物品买单,前面的偷走(即j(检测到的物品,j倒着搜索)>t(现在物品要的时间)),f[j]=min(f[j],f[j-t-1]+c);j-t就是如果偷这个东西那么就相当于从第j-t个物品转移过来
- 如果不符合(1)的条件,则比较前面的物品偷走还是后面的物品偷走f[j]=min(f[j],c)
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2021;//中国共产党成立100周年
int main()
{
int n,ti,ci,f[N];
scanf("%d",&n);
for(int i=1;i<=n;i++)
f[i]=1e9;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&ti,&ci);
for(int j=n;j>=0;j--)
if(j>ti)
f[j]=min(f[j],f[j-ti-1]+ci);
else
f[j]=min(f[j],ci);
}
printf("%d",f[n]);
}