ecnu 1244

顺序可略,多阶段决策,1.当前木块放在第col上面,2.当前木块另起col,3.舍弃

#include <iostream>
#include <cstring>
using namespace std;

struct Block{
    int lens[3];
};

Block blocks[110];
int DP[110][110][110][3];

int M, N;

int judge( int bellow, int f1, int up, int f2 ){

    int bellow_a = blocks[bellow].lens[f1];
    int bellow_b = blocks[bellow].lens[( f1 + 1 ) % 3];
    int up_a     = blocks[up].lens[f2];
    int up_b     = blocks[up].lens[( f2 + 1 ) % 3];

    if( ( up_a <= bellow_a && up_b <= bellow_b ) ||
        ( up_a <= bellow_b && up_b <= bellow_a ) )
        return blocks[up].lens[( f2 + 2 ) % 3];

    return 0;
}

int res_search( int col , int used, int top, int face ){

    if( DP[col][used][top][face] )
        return DP[col][used][top][face];

    if( col == M && used == N )
        return 0;

    if( col != M && used == N )
        return -1;

    int res = 0;

    if( col ){
        for( int f = 0; f <= 2; ++f ){

            int ok = judge( top, face, used + 1, f );

            if( ok )
                res = max( res, res_search( col, used + 1, used + 1, f ) + ok );

        }
    }

    if( col < M ){
        for( int f = 0; f <= 2; ++f ){
            res = max( res, res_search( col + 1, used + 1, used + 1, f ) + blocks[used + 1].lens[( f + 2 ) % 3] );
        }
    }

    res = max( res, res_search( col, used + 1, top, face ) );
    DP[col][used][top][face] = res;

    return res;

}

int main(){

    while( cin >> N >> M ){

        for( int i = 1; i <= N; ++i ){
            cin >> blocks[i].lens[0] >> blocks[i].lens[1] >> blocks[i].lens[2];
        }

        memset( DP, 0, sizeof( DP ) );

        int res = res_search( 0, 0, 0, 0 );

        cout << res << endl;
    }

    return 0;
}
时间: 2024-12-23 03:22:47

ecnu 1244的相关文章

URAL 1244 Gentlement DP +记录路径 好题

1244. Gentlemen Time limit: 0.5 secondMemory limit: 64 MB Let's remember one old joke: Once a gentleman said to another gentleman:— What if we play cards?— You know, I haven't played cards for ten years…— And I haven't played for fifteen years…So, li

ECNU 1328 Stripes (sg函数)

看了张一飞大神的论文,开始找题做,上面提到的一个就是ecnu上的题 链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1328 题目大意:给定red.green.blue三种长度分别为c.z.n的矩形条纹,要求用这三种矩形条纹来cover大小为p x 1的game board,第一个不能再cover的选手为输.问先手是否能赢. 又有一种说法: 题意:其实就是给你L颗石子,你可以取连续的C颗石子,或者连续的Z颗石子,或者连续的N颗石子,谁

【51nod-1239&amp;1244】欧拉函数之和&amp;莫比乌斯函数之和 杜教筛

题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 杜教筛裸题,不过现在我也只会筛这俩前缀和... $$s(n)=\sum _{i=1}^{n}f(i)$$ 那么就有: $$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \

[CODEVS 1244] 云中通信

描述 天空中有n朵云,在风吹之下以恒定速度v=(vx,vy) 向同一个方向持续移动,也就是说,当时间为t(t≥0)时,云上初始坐标为(x, y)的点移到坐标为( x + t*vx, y + t*vy)的位置. 为简单起见,我们假设云是多边形的(而且其顶点具有整数坐标).多边形不一定是凸的,但是每个多边形的任意两条边不相交(允许具有公共的端点).云和云可能会重叠. 地面上有一人造卫星控制中心,位于坐标(0,0)处,在控制中心正上方的云层之上,有一颗人造卫星.一道激光束从控制中心笔直地向上射向人造卫

ural 1244. Gentlemen

1244. Gentlemen Time limit: 0.5 secondMemory limit: 64 MB Let's remember one old joke: Once a gentleman said to another gentleman:— What if we play cards?— You know, I haven't played cards for ten years…— And I haven't played for fifteen years…So, li

URAL 1244. Gentlemen (DP)

题目链接 题意 : 给出一幅不完全的纸牌.算出哪些牌丢失了. 思路 : 算是背包一个吧.if f[j]>0  f[j+a[i]] += f[j];然后在记录一下路径. 1 //1244 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 6 using namespace std ; 7 8 int a[1100000] ,b[1010000]; 9 int dp[1010000]

ECNU 3260 袋鼠妈妈找孩子(dfs)

链接:http://acm.ecnu.edu.cn/problem/3260/ 题意: 给出一个x,y,k.求从左上角到(x,y)最短路径不少于k而且最快到达(x,y)的迷宫.(迷宫有多个 输出其中一个就行) 分析: 因为数据量很少,而且限时很宽,可以考虑dfs.限制是每个要走的格四个方向只能有一个走过的格,其实就是上一个走到这个格子的格,因为如果有多于一个相邻的格子,那么就会从另一个格子走到这格而不是从另一个格子走到上一个格子再走到这格,所以限制条件是成立的. #include <bits/s

莫比乌斯函数之和 51Nod - 1244 (杜教筛)

莫比乌斯函数之和 51Nod - 1244 题意:

HDU 1244 【DP】

题意: 中文. 思路: 先初步处理,用give-take求出每个城市剩的钱. 求解问题转化成使得和不小于0的最长连续字串. 枚举起点,然后当该起点加的和为负时开始枚举下一起点.(这个状态的转移) 2WA原因: 因为扩展了2倍的点使得求解的最长连续的点有可能大于n. #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int tmp[200015]; int main(