usaco 3.4 rockers 动态规划

本文介绍了一种使用动态规划解决音乐录制问题的算法。该算法旨在最大化利用一定数量的光盘录制歌曲的数量,同时确保每张光盘不超过其最大容量。通过三维数组记录状态转移过程,实现了高效求解。

 f[disk][song][ti] 表示用前disk张光盘,录制前song首歌曲(不一定录制第song首歌曲)的最大曲目数,并且当前在录的光盘剩余时间是ti

 

f[disk][song][ti]  =

max(  f[disk][song-1][ti],   f[disk-1][song-1][T-a[song]]  &&  disk > 1 && a[song] <= T,  f[disk][song-1][ti-a[song]] && a[song] <= ti )

 

 

 

  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. using namespace std;

  5. /*
  6. PROG: rockers
  7. LANG: C++
  8. ID: heben991
  9. */


  10. const int N = 25;

  11. int n, T, m, a[N], f[N][N][N];


  12. int main()
  13. {
  14.     int i, disk, song, k, ti;

  15.     freopen("rockers.in""r", stdin);
  16.     freopen("rockers.out","w",stdout);

  17.     scanf("%d%d%d", &n, &T, &m);
  18.     for(i = 1; i <= n; ++i) scanf("%d",a+i);

  19.     for(disk = 1; disk <= m; ++disk)
  20.     {
  21.         for(song = 1; song <= n; ++song)
  22.         {
  23.             for(ti = 0; ti < a[song] && ti <= T; ++ti)
  24.             {
  25.                 f[disk][song][ti] = f[disk][song-1][ti];

  26.                 if(disk>1 && a[song] <= T)
  27.                 f[disk][song][ti] >?= 1+f[disk-1][song-1][T-a[song]];
  28.             }
  29.             for(ti = a[song]; ti <= T; ++ti)
  30.             {
  31.                 f[disk][song][ti] = f[disk][song-1][ti];


  32.                 f[disk][song][ti] >?= 1+f[disk][song-1][ti-a[song]];
  33.             }
  34.         }
  35.     }

  36.     printf("%d/n", f[m][n][T]);
  37. }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值