CF1341D.Nastya and Scoreboard (dp)

linkkkk
题意:
给出 n n n个灯,再点亮恰好 k k k节灯管,问能够组成的最大数,允许有前导零。
思路:
d p [ i ] [ j ] dp[i][j] dp[i][j]表示从 i − n i-n in花费 j j j根灯管能够在 i i i得到的最大数.
代码:

string str[]={"1110111", "0010010", "1011101", "1011011", "0111010", "1101011", "1101111", "1010010", "1111111", "1111011" };

int dp[2100][2100];
string s[2100];

int cul(string s,int id){
    int ans=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='1'&&str[id][i]=='0') return -1;
        else if(s[i]=='0'&&str[id][i]=='1') ans++;
    }
    return ans;
}

int main(){
    int n=read,k=read;
    rep(i,1,n){
        cin>>s[i];
    }
    memset(dp,-1,sizeof dp);
    //dp[i][j]表示从i~n花费j根灯管能够在第i得到的最大数
    for(int i=n;i;i--){
        if(i==n){
            for(int j=0;j<10;j++){
                int tmp=cul(s[i],j);
                if(tmp==-1) continue;//无法变成这个数
                dp[i][tmp]=max(dp[i][tmp],j);
            }
        }
        else{
            for(int j=0;j<10;j++){
                int tmp=cul(s[i],j);
                if(tmp==-1) continue;
                for(int t=tmp;t<=k;t++)
                    if(dp[i+1][t-tmp]!=-1)
                        dp[i][t]=max(dp[i][t],j);
            }
        }
    }
    if(dp[1][k]==-1) puts("-1");
    else{
        int now=k;
        for(int i=1;i<=n;i++){
            cout<<dp[i][now];
            now-=cul(s[i],dp[i][now]);
        }
    }
	return 0;
}
/**

**/




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙睡不醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值