• HDU_3127 WHUgirls(DP)


      大连网络赛之前做的一次模拟赛上见到,开始想用贪心做,但没想到好的贪心策略,之后放下。这几天又重新看了看这道题,有看了看网上的题解,终于把这题A了!。

    思路:

    如图:

    布的总大小为(xx, yy)。剪下的面积为(x, y); 注意这句话: a machine which can cut one cloth into exactly two smaller rectangular pieces horizontally or vertically

    所以可行的剪法有四种,即:


    由上图可得动态转移方程为:

    dp[i][j] = max(dp[i][j], dp[i-x][j] + dp[x][j-y] + c[k]);
    dp[i][j] = max(dp[i][j], dp[i][j-y] + dp[i-x][y] + c[k]);

    dp[i][j] = max(dp[i][j], dp[i-y][j] + dp[y][j-x] + c[k]);
    dp[i][j] = max(dp[i][j], dp[i][j-x] + dp[i-y][x] + c[k]);

    My Code:

    #include <iostream>
    #include
    <cstdio>
    #include
    <cstring>
    #pragma comment(linker,"/STACK:65536000");

    using namespace std;

    const int N = 1002;

    int dp[N][N];
    int w[11][2], c[11];

    int main()
    {
    //freopen("data.in", "r", stdin);

    int t;
    cin
    >> t;
    while(t--)
    {
    int n, a, b, x, y, i, j, k;
    cin
    >> n >> a >> b;
    memset(w,
    0, sizeof(w));
    memset(c,
    0, sizeof(c));
    for(i = 1; i <= n; i++)
    cin
    >> w[i][0] >> w[i][1] >> c[i];
    for(i = 0; i <= a; i++)
    for(j = 0; j <= b; j++)
    dp[i][j]
    = 0;
    for(i = 0; i <= a; i++)
    {
    for(j = 0; j <= b; j++)
    {
    for(k = 1; k <= n; k++)
    {
    x
    = w[k][0];
    y
    = w[k][1];
    if(i >= x && j >= y)
    {
    dp[i][j]
    = max(dp[i][j], dp[i-x][j] + dp[x][j-y] + c[k]);
    dp[i][j]
    = max(dp[i][j], dp[i][j-y] + dp[i-x][y] + c[k]);
    }
    x
    = w[k][1];
    y
    = w[k][0];
    if(i >= x && j >= y)
    {
    dp[i][j]
    = max(dp[i][j], dp[i-x][j] + dp[x][j-y] + c[k]);
    dp[i][j]
    = max(dp[i][j], dp[i][j-y] + dp[i-x][y] + c[k]);
    }
    }
    }
    }
    printf(
    "%d\n", dp[a][b]);
    }
    return 0;
    }



  • 相关阅读:
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    Zuul
    Turbine
    Hystrix
    Feign
    Ribbon
    Eureka
    @MappedSuperclass的作用
  • 原文地址:https://www.cnblogs.com/vongang/p/2167503.html
Copyright © 2020-2023  润新知