Algorithm 版 (精华区)

发信人: ssos (存在与虚无·守拙), 信区: Algorithm
标  题: [合集]Valla的702一定要用DP做吗?
发信站: 哈工大紫丁香 (2002年08月13日08:18:21 星期二), 站内信件


────────────────────────────────────────
 pamws (书虫)                         于 2002年08月10日11:54:14 星期六 说道:

我的递归的方法(下文)肯定要超时的, 网上说必须要用DP.
不过会不会有别的方法呢?
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int count(bool * pp, int sz, int last, bool decrease=false) {
    int result=0;
    bool exist=false;
    for (int i=0; i<sz; i++) {
        if (pp[i]) continue; else exist=true;
        if (decrease && i>=last) continue;
        if (!decrease && i<=last) continue;
        pp[i]=true;
        result+=count(pp, sz, i, !decrease);
        pp[i]=false;
    }
    if (!exist) return 1;
    else return result;
}
int main(void) {
    #ifndef ONLINE_JUDGE
    freopen("702.in", "r", stdin);
    freopen("702.out", "w", stdout);
    #endif
    int num=0;
    int cap=0;
    while (scanf("%d %d", &num, &cap)!=EOF) {
        bool * pp=new bool[num];
        for (int i=0; i<num; i++) {
            pp[i]=false;
        }
        if (cap==1) {
            pp[cap-1]=true;
            pp[1]=true;
            pp[2]=true;
            printf("%d\n", count(pp, num, 1));
        } else {
            pp[cap-1]=true;
            printf("%d\n", count(pp, num, cap-1, true));
        }
    }
    return 0;
}

────────────────────────────────────────
 sino (仿佛永远分离 却又终身相依)     于 2002年08月10日15:32:33 星期六 说道:

这题什么意思啊,没看明白的说..
【 在 pamws (书虫) 的大作中提到: 】
: 我的递归的方法(下文)肯定要超时的, 网上说必须要用DP.
: 不过会不会有别的方法呢?
: #include <stdio.h>
: #include <stdlib.h>
: #include <fcntl.h>
: int count(bool * pp, int sz, int last, bool decrease=false) {
:     int result=0;
:     bool exist=false;
:     for (int i=0; i<sz; i++) {

────────────────────────────────────────
 lizhenguo (Biometrics)               于 2002年08月10日15:58:16 星期六 说道:

他给的最后一个数据是不是有问题啊?
4个人,队长身高最矮,那么排第二的人应该是身高第二矮,这样确定
两个人,剩下两个人任意,应该是2种情况吧。
pamws给解释一下?
【 在 sino (仿佛永远分离 却又终身相依) 的大作中提到: 】
: 这题什么意思啊,没看明白的说..
: 【 在 pamws (书虫) 的大作中提到: 】
: : 我的递归的方法(下文)肯定要超时的, 网上说必须要用DP.
: : 不过会不会有别的方法呢?
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <fcntl.h>
: : int count(bool * pp, int sz, int last, bool decrease=false) {
: :     int result=0;
: :     bool exist=false;
: :     for (int i=0; i<sz; i++) {

────────────────────────────────────────
 pamws (书虫)                         于 2002年08月10日16:01:04 星期六 说道:

e.g. the queue of players, {4} is captain
            @
         @  |
      @  |  |
   @  |  |  |
   |  |  |  |
   ^  ^  ^  ^
No 1  2  3 {4}
then the following schemes are valid
(captain comes first, being taller than his neighbour if possible
and the full queue in zigzag) 
1
   @        
   |     @       
   |  @  |       
   |  |  |  @      
   |  |  |  |      
   ^  ^  ^  ^      
2
   @            
   |     @      
   |     |  @    
   |  @  |  |   
   |  |  |  |   
   ^  ^  ^  ^   
so the number of valid alignment is 2.
【 在 sino (仿佛永远分离 却又终身相依) 的大作中提到: 】
: 这题什么意思啊,没看明白的说..
: 【 在 pamws (书虫) 的大作中提到: 】
: : 我的递归的方法(下文)肯定要超时的, 网上说必须要用DP.
: : 不过会不会有别的方法呢?
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <fcntl.h>
: : int count(bool * pp, int sz, int last, bool decrease=false) {
: :     int result=0;
: :     bool exist=false;
: :     for (int i=0; i<sz; i++) {

────────────────────────────────────────
 pamws (书虫)                         于 2002年08月10日16:02:38 星期六 说道:

必须要站成一高一矮(zigzag), captain最矮的话应该是 1 3 2 4.
【 在 lizhenguo (Biometrics) 的大作中提到: 】
: 他给的最后一个数据是不是有问题啊?
: 4个人,队长身高最矮,那么排第二的人应该是身高第二矮,这样确定
: 两个人,剩下两个人任意,应该是2种情况吧。
: pamws给解释一下?
: 【 在 sino (仿佛永远分离 却又终身相依) 的大作中提到: 】
: : 这题什么意思啊,没看明白的说..

────────────────────────────────────────
 lizhenguo (Biometrics)               于 2002年08月10日16:30:13 星期六 说道:

他所说的DP是不是指递推求n个数的zigzag排法啊
zigzag(n)=zigzag(n-1)*(n-2)+(zigzag(n-1)-1)*2
zigzag(3)=3
感觉一般DP能解决的问题,其他方法在规模很大的时候解决的可能性
比较小
【 在 pamws (书虫) 的大作中提到: 】
: 必须要站成一高一矮(zigzag), captain最矮的话应该是 1 3 2 4.
: 【 在 lizhenguo (Biometrics) 的大作中提到: 】
: : 他给的最后一个数据是不是有问题啊?
: : 4个人,队长身高最矮,那么排第二的人应该是身高第二矮,这样确定
: : 两个人,剩下两个人任意,应该是2种情况吧。
: : pamws给解释一下?

────────────────────────────────────────
 pamws (书虫)                         于 2002年08月10日18:11:33 星期六 说道:

zigzag(3)=4
3 1 2  ↓↑
1 3 2  ↑↓
2 1 3  ↓↑
2 3 1  ↑↓
【 在 lizhenguo (Biometrics) 的大作中提到: 】
: 他所说的DP是不是指递推求n个数的zigzag排法啊
: zigzag(n)=zigzag(n-1)*(n-2)+(zigzag(n-1)-1)*2
: zigzag(3)=3
: 感觉一般DP能解决的问题,其他方法在规模很大的时候解决的可能性
: 比较小
: 【 在 pamws (书虫) 的大作中提到: 】
: : 必须要站成一高一矮(zigzag), captain最矮的话应该是 1 3 2 4.

────────────────────────────────────────
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.517毫秒