hdu1158(dp)
2024-10-03 01:48:00
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1158
分析:dp[i][j]表示第i个月用j个人需要花费的最少费用;
则状态转移方程为:dp[i][j]=min(dp[i-1][k]+j*b+(j>k?(j-k)*a:(k-j)*c),dp[i][j]);(m[i-1]<=k<=sum)
这个状态方程不难,只需要根据第i个月比第i-1个月的人数增减来改变一下就好。
这里sum为12个月最大值就可以了,刚开sum表示m总和,TLE到泪奔。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 1000000007
#define inf 1<<30
#define N 100010
using namespace std;
int dp[][],m[];
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int sum=;
for(int i=;i<=n;i++)scanf("%d",&m[i]),sum=max(m[i],sum);
memset(dp,0x3f,sizeof(dp));
dp[][m[]]=m[]*(a+b);
for(int i=;i<=n;i++)
{
for(int j=m[i];j<=sum;j++)
{
for(int k=m[i-];k<=sum;k++)
dp[i][j]=min(dp[i-][k]+j*b+(j>k?(j-k)*a:(k-j)*c),dp[i][j]);
}
}
int ans=;
for(int i=m[n];i<=sum;i++)ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
}
最新文章
- “(null)” is of a model that is not supported by this version of Xcode. Please use a different device.
- git版本控制管理实践-2
- https基础流程
- 使用mxmlc在命令行编译.as代码
- js中的回调函数的理解和使用方法
- 借助 MySQLTuner 优化 MySQL 性能(转载的一篇文章)
- LoadRunner ---思考时间设置
- 1. Programming in C is fun!
- 【转】gcc中-pthread和-lpthread的区别
- Java API ——Object类
- android126 zhihuibeijing 极光推送
- STSdb
- 【转】Mysql三种备份详解
- C# 创建Windows服务。服务功能:定时操作数据库 (转)
- [LeetCode] Longest Uncommon Subsequence II 最长非共同子序列之二
- Windows 下使用 工具修改文件的 时间
- opencontrail—VXLAN模式下数据包的传输过程
- react-native添加react-native-vector-icons插件android遇到的问题
- css过渡
- mysql的基础增删改查(一)