您的位置:首页 > 其它

Educational Codeforces Round 39-D-Timetable(背包DP)

2018-03-08 10:45 441 查看


题意:给你n天,每天有m节课,你最多可以逃k节课,并且对于某一天,在你决定上的第一节课和最后一节课之间就算没课,也要待在学校,问你可以在学校呆的最少时间是多少?

题解:对于每天,我们暴力出上x节课需要在学校呆的最长时间,然后设dp[i][j]表示前i天逃掉j节课所在学校呆的最长时间,跑一发类似于背包dp即可。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int sum[505][505],a[505][505],b[505][505];
int dp[505][505],ans,n,m,k;
int main(void)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%1d",&a[i][j]),sum[i][j]=sum[i][j-1]+a[i][j];
for(int t=1;t<=n;t++)
for(int i=1;i<=m;i++)
for(int j=i-1;j<=m;j++)
{
int tmp=sum[t][j]-sum[t][i-1];
b[t][sum[t][m]-tmp]=max(b[t][sum[t][m]-tmp],m-(j-i+1));
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++)
for(int t=0;t<=j;t++)
dp[i][j]=max(dp[i][j],dp[i-1][j-t]+b[i][t]);
for(int i=0;i<=k;i++)
ans=max(ans,dp
[i]);
printf("%d\n",n*m-ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: