http://acm.hdu.edu.cn/showproblem.php?pid=6249
dp[i][j]表示在1-i的邮票内买j套所得到最多的邮票数
ri[i]表示第i种邮票所在的套装中最右边的邮票id
#include<bits/stdc++.h>
using namespace std;
int dp[2222][2222];
int ri[2222];
int main(){
int t;
cin>>t;
int cs=1;
while(t--)
{
memset(dp,0,sizeof(dp));
memset(ri,0,sizeof(ri));
int n,m,k;
int l,r;
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
cin>>l>>r;
for(int j=l;j<=r;j++)
{
ri[j]=max(ri[j],r);
}
}
cout<<"Case #"<<cs++<<": ";
for(int i=1;i<=n;i++)
{
for(int j=0;j<k;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j]);
dp[i][j+1]=max(dp[i][j+1],dp[i-1][j+1]);
if(ri[i])
{
dp[ri[i]][j+1]=max(dp[ri[i]][j+1],dp[i-1][j]+ri[i]-i+1);
}
}
}
cout<<dp[n][k]<<endl;
}
return 0;
}
本文深入探讨了一种邮票收集问题的动态规划算法实现,通过定义dp数组和ri数组来记录状态转移过程,旨在最大化收集邮票的数量。文章详细解释了算法流程,包括初始化dp和ri数组,输入邮票集合范围,以及核心的状态转移方程。
669

被折叠的 条评论
为什么被折叠?



