您的位置:首页 > 其它

Educational Codeforces Round 39 (Rated for Div. 2)D. Timetable(dp)

2018-03-08 11:45 671 查看
先对每一行进行处理,每一行中g[i][j]代表第i行除去j节课最少上的课数。

知道了g[i][j],进行记忆化搜索,dp[i][j]代表第i行剩下k节课可以逃,最少上的课数。

两个地方需要dp,水平不够啊啊啊啊啊。O(∩_∩)O哈哈~

#include <bits/stdc++.h>
#define pb push_back
#define fore(i,a,b) for(int i=a,ThxDem=b;i<ThxDem;++i)
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;

int n,m,k;
char s[512];
int g[512][512];
int dp[512][512];

int f(int i, int k){
int& r=dp[i][k];
if(r>=0)return r;
if(i==n)r=0;
else {
r=1<<30;
for(int j=0;j<=k;j++)r=min(r,g[i][j]+f(i+1,k-j));
}
return r;
}

int main(){
scanf("%d%d%d",&n,&m,&k);
vector<int> x;
for(int i=0;i<n;i++){
scanf("%s",s);
x.clear();
for(int j=0;j<m;j++)if(s[j]=='1')x.pb(j);
for(int j=0;j<(int)x.size();j++){
g[i][j]=10000;
for(int k=0;k<=j;k++)
{
//cout<<1+x[x.size()-1-(j-k)]-x[k]<<" "<<g[i];
g[i][j]=min(g[i][j],(1+x[x.size()-1-(j-k)]-x[k]));}
}
//cout<<endl;
//cout<<"<<"<<endl;
}
memset(dp,-1,sizeof(dp));
printf("%d\n",f(0,k));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐