bzoj 1222 DP

  用w[i]表示在A中用了i的时间时在B中最少用多长时间,然后转移就可以了。

  备注:这个边界不好定义,所以可以每次用一个cur来存储最优值,然后对w[i]赋值就可以了。


/**************************************************************
Problem: 1222
User: BLADEVIL
Language: C++
Result: Accepted
Time:2648 ms
Memory:992 kb
****************************************************************/

//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 6010
#define inf (~0U>>2)

using namespace std;

int n,m;
int a[maxn],b[maxn],c[maxn];
int w[maxn*5];

int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
for (int i=1;i<=n;i++) {
if (!a[i]) a[i]=inf;
if (!b[i]) b[i]=inf;
if (!c[i]) c[i]=inf;
m+=min(a[i],min(b[i],c[i]));
}
for (int i=1;i<=n;i++)
for (int j=m;j>=0;j--) {
int cur(inf);
if (b[i]!=inf) cur=w[j]+b[i];
if (j>=a[i]) cur=min(cur,w[j-a[i]]);
if (j>=c[i]) cur=min(cur,w[j-c[i]]+c[i]);
w[j]=cur;
}
int ans(inf);
for (int i=1;i<=m;i++) ans=min(ans,max(i,w[i]));//printf("%d ",w[i]);
printf("%d\n",ans);
return 0;
}

update:又仔细想了想这道题,发现其实是可以不用cur的,我们只需要每次假设当前i这个物品在某个机器上加工了,然后再不断更新就可以了。不知道哪里可能会溢出,所以将inf的值改小就可以了。


/**************************************************************
Problem: 1222
User: BLADEVIL
Language: C++
Result: Accepted
Time:2100 ms
Memory:992 kb
****************************************************************/

//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 6010
#define inf (30010)

using namespace std;

int n,m;
int a[maxn],b[maxn],c[maxn];
int w[maxn*5];

int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
for (int i=1;i<=n;i++) {
if (!a[i]) a[i]=inf;
if (!b[i]) b[i]=inf;
if (!c[i]) c[i]=inf;
m+=min(a[i],min(b[i],c[i]));
}
for (int i=1;i<=n;i++)
for (int j=m;j>=0;j--) {
w[j]=w[j]+b[i];
if (j>=a[i]) w[j]=min(w[j],w[j-a[i]]);
if (j>=c[i]) w[j]=min(w[j],w[j-c[i]]+c[i]);
}
int ans(inf);
for (int i=1;i<=m;i++) ans=min(ans,max(i,w[i]));//printf("%d ",w[i]);
printf("%d\n",ans);
return 0;
}

bzoj 1222 DP

时间: 2024-11-05 12:32:34

bzoj 1222 DP的相关文章

bzoj 1791 DP

首先对于一棵树我们可以tree_dp来解决这个问题,那么对于环上每个点为根的树我们可以求出这个树的一端为根的最长链,并且在tree_dp的过程中更新答案.那么我们对于环,从某个点断开,破环为链,然后再用DP来解决这个问题. 备注:很久之前的一道题,刚转的c++,然后T了,也懒得改了. /************************************************************** Problem: 1791 User: BLADEVIL Language: C++

bzoj 3622 DP + 容斥

LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[i]大于b的组数. 不妨从整体去考虑,使用$f[n][j]$代表前n个中有j组$a[i]>b[i]$,很容易得到转移式$f[n][j]=f[n-1][j]+f[n-1][j-1]*(cnt[n]-(j-1))$,其中$cnt[i]$为比a[i]小的b[]个数 但是仔细思考该式子含义会发现,$f[n][j

bzoj 1222: [HNOI2001]产品加工 dp

1222: [HNOI2001]产品加工 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 381  Solved: 218[Submit][Status][Discuss] Description 某 加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所 需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同.某一天,加工厂接到n个产品加工的任务,

BZOJ 2431 &amp; DP

题意:求逆序对数量为k的长度为n的排列的个数 SOL: 显然我们可以对最后一位数字进行讨论,判断其已经产生多少逆序对数量,然后对于前n-1位同样考虑---->每一个长度的排列我们都可以看做是相同的,因为它与最后一位的影响我们已经计算过了.那么就变成了一个好多维DP的过程... 不过我的方程感觉有点太直白,应该可以优化因为在BZ上都是卡时过去的...太慢了...大概状态还是有问题.... Code: /*===============================================

BZOJ 2101 DP+优化

思路: http://www.cnblogs.com/exponent/archive/2011/08/14/2137849.html f[i,i+len]=sum[i,i+len]-min(f[i+1,i+len],f[i,i+len-1]); 但题目把n出到5000,内存卡到64M,二维的状态存不下.. 其实,j这一维可以省掉.我们换个状态表示 f[i,i+len]=sum[i,i+len]-min(f[i+1,i+len],f[i,i+len-1]) 然后循环这样写: for len=1

BZOJ 1003 dp+最短路

1003: [ZJOI2006]物流运输 题意:m个码头,从码头1到码头m,连续n天都要运送货物.每一天的花费是总路线长度大小,但如果和前一天的路线不一样,要另处加上k元花费.而且有些码头有些天不能用,问这n天的最小费用. tags:菜鸡一开始真没想到是dp 求n天时最小花费,就要想到以天数为阶段进行规划.dp[i][j]表示第i天到第j天走同一条路线的花费,则f[i]=min( f[i], f[j]+dp[j+1][i]+k ). #include<bits/stdc++.h> using

bzoj 1009 DP 矩阵优化

原来的DP: dp[i][j]表示长度为i的合法串,并且它的长度为j的后缀是给定串的长度为j的前缀. 转移: i==0 dp[0][0] = 1 dp[0][1~m-1] = 0 i>=1 dp[i][0] = dp[i-1][0]*10-dp[i-1][m-1] dp[i][1] = dp[i-1][0]-(a[m]==a[1])*dp[i-1][m-1] dp[i][2] = dp[i-1][1]-(a[m-1~m]==a[1~2])*dp[i-1][m-1] dp[i][3] = dp[i

BZOJ 1010 dp 斜率优化

题意: 给一段数列,要求分成若干段,有一个公式可算每段的花费,求整段数列最小花费. 题意很裸,不难得出状态转移方程:dp[i]=min{dp[j]+(sum[i]-sum[j-1]+i-j-l)^2}(j<i); 但是数据范围很大,o(n^2)过不了,于是就用斜率优化变成n的,就过了. 下面详细讲一下斜率优化: 斜率优化就是维护一个凸壳,使其严格上凸或下凸,具体情况具体分析,就本题而言设有k<j<i,且i从k转移来的, 则:dp[k]+(sum[i]-sum[k-1]+i-k-l)^2&

BZOJ 1207 DP

打一次鼹鼠必定是从以前的某一次打鼹鼠转移过来的 以打每个鼹鼠时的最优解为DP方程 #include<iostream> #include<cstdio> #include<cstdlib> #define N 10005 using namespace std; int n,m,ans; int f[N],t[N],x[N],y[N],mx[N]; int main() { scanf("%d%d",&n,&m); for(int i