我是靠谱客的博主 神勇刺猬,最近开发中收集的这篇文章主要介绍CodeForces 349B Color the Fence (dp),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意:

给出1~9数字对应的费用以及一定的费用,让你输出所选的数字所能组合出的最大的数值。


思路:

dp

一开始想歪了(sort并不对= =)。

dp[i]:费用为i时,最大所能得到的数字个数。

par[i]:记录当前i的状态是由前面哪个状态转移来的。

path[i]:记录费用到i时,所选的数字。

输出方案时,根据par数组从n往回跳,直到为0。途中把path中的数字记录个数。后面从大到小输出数字即可。


code:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+5;
int v;
int a[15];
int dp[MAXN], path[MAXN], par[MAXN];
//path:记录当前点选的数值,par:记录我应该怎么跳;
int cnt[15];
int main() {
cin>>v;
for(int i = 1;i <= 9; i++)
scanf("%d", a+i);
//
for(int i = 1;i <= v; i++) {
for(int j = 1;j <= 9; j++) {
if(i < a[j]) continue;
int tmp = dp[i-a[j]]+1;
if(dp[i] < tmp || (dp[i]==tmp && path[i] < j)) {
dp[i] = tmp;
path[i] = j;
par[i] = i-a[j];
}
}
if(dp[i] < dp[i-1]) {
dp[i] = dp[i-1];
par[i] = i-1;
path[i] = 0;
}
}
if(dp[v] == 0) {
puts("-1");
return 0;
}
int idx = v;
while(idx != 0) {
cnt[path[idx]]++;
idx = par[idx];
}
for(int i = 9;i >= 1; i--) {
while(cnt[i]--)
printf("%d", i);
}
puts("");
return 0;
}


最后

以上就是神勇刺猬为你收集整理的CodeForces 349B Color the Fence (dp)的全部内容,希望文章能够帮你解决CodeForces 349B Color the Fence (dp)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部