UVA - 10163 - Storage Keepers(两次dp)
2014-10-27 19:26
323 查看
要进行两次dp:
第一次,d[ i ][ j ]表示前i个仓库由j个人守的L(max)
.
第二次,根据第一次的结果dp,d[ i ][ j ]表示前i个仓库由j个人守的Y(min) .
第一次,d[ i ][ j ]表示前i个仓库由j个人守的L(max)
.
第二次,根据第一次的结果dp,d[ i ][ j ]表示前i个仓库由j个人守的Y(min) .
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <vector> #include <sstream> using namespace std; typedef long long LL; typedef unsigned long long LLU; const int INF=1e9; int d[111][33], p[33], cost[111][33]; int n, m; void dp() { memset(d, 0, sizeof(d)); memset(cost, 0, sizeof(cost)); for(int i=0; i<=m; i++) d[0][i]=INF; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { d[i][j]=d[i][j-1]; for(int k=0; k<i; k++) d[i][j]=max(d[i][j], min(d[k][j-1], p[j]/(i-k))); } printf("%d ", d [m]); int ans1=d [m]; if(!ans1) { puts("0"); return ; } memset(d, 0, sizeof(d)); for(int i=1; i<=n; i++) d[i][0]=INF; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { d[i][j]=d[i][j-1]; for(int k=0; k<i; k++) if(p[j]/(i-k)>=ans1) d[i][j]=min(d[i][j], d[k][j-1]+p[j]); } printf("%d\n", d [m]); } int main() { while(~scanf("%d%d", &n, &m) && m+n) { for(int i=1; i<=m; i++) scanf("%d", &p[i]); dp(); } return 0; }
相关文章推荐
- UVa 10163 Storage Keepers(两次DP)
- DP(两次) UVA 10163 Storage Keepers
- UVA 10163 Storage Keepers 两次dp
- HDU 5445 Food Problem、UVa 10163 Storage Keepers、POJ 3260 The Fewest Coins(两次dp)
- UVA 10163 Storage Keepers(两次DP)
- UVA 10163 Storage Keepers(两次DP)
- uva10163(两次dp)
- uva_10163 - Storage Keepers ( 普通DP )
- UVA 10163 - Storage Keepers(dp)
- Storage Keepers - UVa 10163 dp
- uva 10163 Storage Keepers (dp)
- UVA 10163 - Storage Keepers(dp)
- UVA 10163 - Storage Keepers(dp)
- UVA-10163 Storage Keepers (DP多次)
- uva 10163 Storage Keepers (DP)
- uva 10163 两次Dp
- 100道动态规划——13 UVA 10163 Storage Keepers 有约束条件下的DP,递推,不能使用结构体作为基本单位
- UVA 10163-Storage Keepers(DP)
- uva 10163——Storage Keepers
- 【DP】Uva 10163