列表

详情


NC220677. 商品摆放

描述

在一个超市里出售种商品,分别编号
如果某两种商品摆放在相邻的位置上,他们可能会刺激顾客消费以带来额外收益(比如炸鸡便当和可乐)。
假设我们初始已经有了一个个商品的货架,每个货架的位置上都摆放着某个商品。假设你可以最多移除件商品,移除后原本不相邻的商品就会变的相邻,请问你可以获得最大的额外收益是多少呢?

输入描述

第一行三个以空格分隔的整数
第二行个以空格分隔的整数数组,表示初始的时候第个位置摆放着第种商品。
接下来的的矩阵,其中第行第列代表,表示这2种商品如果摆放在相邻位置会产生的额外收益。

输出描述

输出一行,一个整数表示你可以获得的最大额外收益。

示例1

输入:

4 1 3
1 4 2
0 3 0 1
3 0 0 0
0 0 0 0
1 0 0 0

输出:

3

说明:

如果不移除任何商品,则额外收益总和为w_{14}+w_{42}=1
如果移除位置为2的商品,则额外收益综合为w_{12}=3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3(pypy3.6.1) 解法, 执行用时: 178ms, 内存消耗: 22256K, 提交时间: 2021-05-11 10:14:08

s = input()
n,k,m = list(map(int,s.split()))
s = input()
objs = list(map(int,s.split()))
weight = []
for i in range(n):
    s = input()
    tmp_list = list(map(int,s.split()))
    weight.append(tmp_list)
weight.append([0] * n)
row = m+2
col = k+1
dp = []
for i in range(row):
    tmp_list = [0]*col
    dp.append(tmp_list)
for i in range(row):
    for j in range(col):
        for t in range(1,i):
            if 0<=i-t<row and 0<=j-t+1<col and  0<=i-1<m and 0<= i-t-1 < m:
                dp[i][j] = max(dp[i][j],dp[i-t][j-t+1] + weight[objs[i-1]-1][objs[i-t-1] -1])
res = -1
for i in range(row):
    if dp[i][-1] > res:
        res = dp[i][-1]
print(res)

C++(clang++11) 解法, 执行用时: 11ms, 内存消耗: 732K, 提交时间: 2021-05-08 16:06:47

#include<bits/stdc++.h>
using namespace std;

int a[205],mp[205][205],DP[205][205];
int main()
{
	int i,j,len,n,t,m,ans=0;
	scanf("%d%d%d",&n,&t,&m);
	for(i=1;i<=m;i++)scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)scanf("%d",&mp[i][j]);
	for(i=1;i<=m;i++)
	{
		for(j=0;j<=t;j++)
		{
			for(len=0;len<=min(i-1,j);len++)DP[i][j]=max(DP[i][j],DP[i-1-len][j-len]+mp[a[i]][a[i-1-len]]);
			ans=max(ans,DP[i][j]);
		}
	}
	printf("%d\n",ans);
    return 0;
}

上一题