zoukankan      html  css  js  c++  java
  • UVA 10118 Free Candies

    UVA_10118

        我们可以定义f[n1][n2][n3][n4]为当四个piles分别拿到第n1、n2、n3、n4个糖果时,能够拿回家的最多的pair数,然后在状态转移的时候需要借助一个数组来记录basket的情况,可以容易想象的是,对于一个f状态,一定有唯一一个basket的状况(当然假设能取走的糖果都取走了)与之相对应。

        为了实现起来更方便,我还是选用了记忆化搜索。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 50
    int N, f[MAXD][MAXD][MAXD][MAXD], x[5][MAXD];
    int init()
    {
    int i, j;
    scanf("%d", &N);
    if(!N)
    return 0;
    for(i = 0; i < N; i ++)
    for(j = 0; j < 4; j ++)
    scanf("%d", &x[j][i]);
    return 1;
    }
    int dp(int y[], int s, int t[])
    {
    int i, j, k, max = 0;
    if(f[t[0]][t[1]][t[2]][t[3]] != -1)
    return f[t[0]][t[1]][t[2]][t[3]];
    if(s == 5)
    return f[t[0]][t[1]][t[2]][t[3]] = 0;
    for(i = 0; i < 4; i ++)
    if(t[i] != N)
    {
    int r[25];
    memcpy(r, y, sizeof(r));
    int top[5];
    memcpy(top, t, sizeof(top));
    top[i] ++;
    if(r[x[i][t[i]]])
    {
    r[x[i][t[i]]] = 0;
    k = dp(r, s - 1, top);
    if(k + 1 > max)
    max = k + 1;
    }
    else
    {
    r[x[i][t[i]]] = 1;
    k = dp(r, s + 1, top);
    if(k > max)
    max = k;
    }
    }
    return f[t[0]][t[1]][t[2]][t[3]] = max;
    }
    void solve()
    {
    int res, r[25] = {0}, top[5] = {0};
    memset(f, -1, sizeof(f));
    res = dp(r, 0, top);
    printf("%d\n", res);
    }
    int main()
    {
    while(init())
    solve();
    return 0;
    }


  • 相关阅读:
    PHP将数组转换为xml
    PHP对象转数组
    MongoDB 基础命令 (MongoDB Shell)
    PHP操作Redis常用技巧
    JavaScript 表达式 Expression
    JavaScript 语句 Statement
    JavaScript 原子常量 Atom
    encodeURI()和encodeURIComponent() 区别
    Unicode 与 JavaScript 详解
    DOCKER 相关的一些用法
  • 原文地址:https://www.cnblogs.com/staginner/p/2277247.html
Copyright © 2011-2022 走看看