zoukankan      html  css  js  c++  java
  • 一道简单的动态规划

    这是一道usaco的题,section 3.4 raucous rockets

    如果只有1张唱片,就是一个背包问题,现在有m张唱片,怎么办呢?

    dp[i][j][k]表示前i首歌曲在j个cd中最后一个cd时间为k的最大值

    如果这首歌不选,就是dp[i-1][j][k]

    如果选,可以在当前时间就选,就是dp[i-1][j][k-a[i]]+1

    也可以在以前选啊。。就是dp[i][j][k-1](如果k是0怎么办?那就用dp[i][j-1][t(t是时间最大值)]!)

    这里可以优化啊。。在现在的cd上又不马上放的话还不如在当前就选。。所以就相当于在前面的cd上放。那我们就用dp[i][j-1][t];

    我们就得到了递推式dp[i][j][k] = max(dp[i-1][j][k],  dp[i-1][j][k-a[i]]+1,  dp[i][j][k-1]);

    写出代码:

    # include <cstdio>
    # include <iostream>
    # include <algorithm>
    using namespace std;
    int dp[21][21][21],a[21];
    int main()
    {
        freopen("rockers.in","r",stdin);
        freopen("rockers.out","w",stdout);
        int n,t,m,i,j,k;
        cin>>n>>t>>m;
        for (i=1;i<=n;++i)
            cin>>a[i];
        for (i=1;i<=n;++i)
            for (j=1;j<=m;++j)
                for (k=0;k<=t;++k)
                {
                    if (k==0) 
                        dp[i][j][k] = max(dp[i][j-1][t],dp[i-1][j][k]);
                    else
                        dp[i][j][k] = max(dp[i][j][k-1],dp[i-1][j][k]);
                    if (k>=a[i]&&dp[i][j][k] < dp[i-1][j][k-a[i]]+1)
                        dp[i][j][k] = dp[i-1][j][k-a[i]]+1;
                }    
        cout<<dp[n][m][t]<<endl;
        return 0;
    }

     还可以写

    # include <cstdio>
    # include <iostream>
    # include <algorithm>
    using namespace std;
    int dp[21][21][21],a[21];
    int main()
    {
        freopen("rockers.in","r",stdin);
        freopen("rockers.out","w",stdout);
        int n,t,m,i,j,k;
        cin>>n>>t>>m;
        for (i=1;i<=n;++i)
            cin>>a[i];
        for (i=1;i<=n;++i)
            for (j=1;j<=m;++j)
                for (k=0;k<=t;++k)
                {
                       dp[i][j][k] = max(dp[i][j-1][t],dp[i-1][j][k]);
                    if (k>=a[i]&&dp[i][j][k] < dp[i-1][j][k-a[i]]+1)
                        dp[i][j][k] = dp[i-1][j][k-a[i]]+1;
                }    
        cout<<dp[n][m][t]<<endl;
        return 0;
    }
  • 相关阅读:
    二分-hdu-4768-Flyer
    UVa 340 Master-Mind Hints (优化查找&复制数组)
    Android中的多媒体显示之图片缩放
    asp.net总结(一)
    JAVA中JNI的简单使用
    HDFS集群balance(2)-- 架构概览
    [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
    HDFS集群balance(3)-- 架构细节
    项目总结——深入浅出socket网络编程
    HDFS集群balance(4)-- 测试计划
  • 原文地址:https://www.cnblogs.com/1carus/p/3328919.html
Copyright © 2011-2022 走看看