1、看了网上的很多题解,我觉得还是把问题转化成选哪几个电源,dp[i]代表考虑前i个电源后的最小费用,每次用第i个电源去逐个替换前面的电源。
2、有人说觉得和最长上升子序列挺相似的,我。。。再悟悟
总体的过程就是拿当前最大的电压值对应的灯去挨个替换比它小的
存疑:存在电源3去替换电源1但是不替换电源2的情况吗?
如果3+2 +solve(1)>3 + solve(2),2就不会被3替换,否则2就会被3替换 嗯,就酱
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
struct lamp
{
int v,k,c,l;
bool operator < (const lamp &rhs)const
{
return v<rhs.v; //按照电压值从小到大排序
}
}a[1100];
int dp[1100];
int solve(int u)
{
int &ans=dp[u];
if(ans!=-1) return ans;
if(u==0) return ans=0;
ans=INF;
int sum=a[u].k;
for(int i=u;i;--i)
{
sum+=a[u].c*a[i].l;
ans=min(ans,sum+solve(i-1));
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=1;i<=n;++i)
{
scanf("%d%d%d%d",&a[i].v,&a[i].k,&a[i].c,&a[i].l);
}
sort(a+1,a+1+n);
memset(dp,-1,sizeof(dp));
printf("%d\n", solve(n));
}
return 0;
}