随笔 - 87  文章 - 279  trackbacks - 0
<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

潜心看书研究!

常用链接

留言簿(19)

随笔分类(81)

文章分类(89)

相册

ACM OJ

My friends

搜索

  •  

积分与排名

  • 积分 - 214751
  • 排名 - 116

最新评论

阅读排行榜

评论排行榜

开始时候粗心,状态转移时候k写成k-1了,查了n久.

The Mailboxes Manufacturers Problem
Time Limit:1000MS  Memory Limit:65536K
Total Submit:299 Accepted:227

Description

In the good old days when Swedish children were still allowed to blowup their fingers with fire-crackers, gangs of excited kids would plague certain smaller cities during Easter time, with only one thing in mind: To blow things up. Small boxes were easy to blow up, and thus mailboxes became a popular target. Now, a small mailbox manufacturer is interested in how many fire-crackers his new mailbox prototype can withstand without exploding and has hired you to help him. He will provide you with k (1 ≤ k ≤ 10) identical mailbox prototypes each fitting up to m (1 ≤ m ≤ 100) crackers. However, he is not sure of how many firecrackers he needs to provide you with in order for you to be able to solve his problem, so he asks you. You think for a while and then say, “Well,if I blow up a mailbox I can’t use it again, so if you would provide me with only k = 1 mailboxes, I would have to start testing with 1 cracker, then 2 crackers, and so on until it finally exploded. In the worst case, that is if it does not blow up even when filled with m crackers, I would need 1 + 2 + 3 + … + m = m × (m + 1) ⁄ 2 crackers. If m = 100 that would mean more than 5000 fire-crackers!” “That’s too many,” he replies. “What if I give you more than k = 1 mailboxes? Can you find a strategy that requires less crackers?”

Can you? And what is the minimum number of crackers that you should ask him to provide you with?

You may assume the following:

  1. If a mailbox can withstand x fire-crackers, it can also withstand x − 1 fire-crackers.
  2. Upon an explosion, a mailbox is either totally destroyed (blown up) or unharmed, which means that it can be reused in another test explosion.

Note: If the mailbox can withstand a full load of m fire-crackers, then the manufacturer will of course be satisfied with that answer. But otherwise he is looking for the maximum number of crackers that his mailboxes can withstand.

Input

The input starts with a single integer N (1 ≤ N ≤ 10) indicating the number of test cases to follow. Each test case is described by a line containing two integers: k and m, separated by a single space.

Output

For each test case print one line with a single integer indicating the minimum number of fire-crackers that is needed, in the worst case, in order to figure out how many crackers the mailbox prototype can withstand.

Sample Input

4
1 10
1 100
3 73
5 100

Sample Output

55
5050
382
495

Source
Svenskt Mästerskap i Programmering/Norgesmesterskapet 2002

#include <iostream>
using namespace std;

const int INF = 1 << 28;

int d[11][101][101];
int sum(int i, int j) {
    
int ret = 0, k;
    
for (k=i; k<=j; k++) ret += k;
    return ret;
}

int max(int a, int b) {
    return a 
> b ? a : b;
}


int main() {
    
int caseTime; 
    
int i, j, k, t, K, M, l;
    scanf(
"%d"&caseTime);
    
    
while (caseTime--) {
        scanf(
"%d%d"&K, &M);
        
for (i=1; i<=M; i++) {
            
for (j=i; j<=M; j++) {
                d[
1][i][j] = sum(i, j);
            }
        }
        
for (k=2; k<=K; k++) {
            
for (l=0; l<M; l++) {
                
for (i=1; i+l<=M; i++) {
                    j 
= i + l;
                    
if (i == j) {
                        d[k][i][j] 
= i;
                        continue;
                    }
                    d[k][i][j] 
= INF;
                    
for (t=i; t<=j; t++) {
                        
int tmp;
                        
if (t == i) tmp = d[k][i+1][j];
                        
else if (t == j) tmp = d[k-1][i][j-1];
                        
else tmp = max(d[k-1][i][t-1], d[k-1][t+1][j]);
                        tmp 
= max(d[k-1][i][t-1], d[k][t+1][j]);
                        
if (d[k][i][j] > t + tmp) d[k][i][j] = t + tmp;
                    }
                }
            }
        }
        printf(
"%d\n", d[K][1][M]);
    }

    return 
0;
}
posted on 2007-03-26 00:41 阅读(2196) 评论(2)  编辑 收藏 引用 所属分类: ACM题目

FeedBack:
# re: pku2904 3维dp 2007-03-27 16:31 litianze
我是一个刚刚开始做acm题的菜鸟,望大哥帮帮忙,可以介绍一下解决的思想吗?小弟先谢谢了!  回复  更多评论
  
# re: pku2904 3维dp 2007-03-27 23:04 
dp[k][i][j]表示k个邮筒时候放鞭炮数为i..j时候的最优值

转移方程为
dp[k][i][j] = min{t+max(d[k-1][i][t-1],d[k][t+1][j])};

状态转移时候就是考虑选t个鞭炮放时候爆或不爆  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理