NSUOJ - 暴力 - Problem 3155

题目来源 http://acm.ccniit.com/problem.php?cid=1201&pid=3

一.题目描述

给你三个整数N,M,Q,和Q个要求ai,bi,ci,di。
构造一个N项的数列A,序列A里面的值都为正整数,满足 Ai ≤ Ai+1 ,最大项AN不超过M,若满足式子Abi - Aai = ci ,则可获得di 点分,求满足条件的序列的最大得分。

Input

第一行输入N,M,Q,下面Q行,每行4个数。
ai   bi    ci   di
……
aQ  bQ  cQ  dQ
2 ≤ N ≤ 10
1 ≤ M ≤ 10
1 ≤ Q ≤ 50
1 ≤ ai < bi ≤ N  ( i = 1,2,...,Q )
0 ≤ ci ≤ M - 1  ( i = 1,2,...,Q )
1 ≤ di ≤ 105  ( i = 1,2,...,Q )
(ai,bi,ci ) ≠ ( aj,bj,cj )  ( i ≠ j)

Output

最大得分

Sample Input Copy

3 4 3
1 3 3 100
1 2 2 10
2 3 2 10

Sample Output Copy

110

HINT

这个序列可以为:1 2 4 或 1 3 4

二.解题思路

 结构体存获得分数要求  暴力搜索 dfs模拟数列  再跑循环判断当前数列获得的总分数 max取最大值

三.代码

#include <bits/stdc++.h>
using namespace std;
struct p {
    int l, r, d, money;
} z[100];
int v[20];
int n, m, num, q;
long long mmax = 0;
void dfs(int x, int step) {
    if (step > n) { //n个数够了模拟数列完成
        long long d = 0;
        for (int i = 1; i <= q; ++i) {
            if (v[z[i].l] + z[i].d == v[z[i].r]) { //满足条件获得该项分数
                d += z[i].money;
            }
        }
        mmax = max(mmax, d);
        return;
    }
    for (int i = x; i <= m; ++i) { //后一位要大于等于上一位 同时小于等于m
        v[step] = i;
        dfs(i, step + 1);//数组v模拟数列 将这一位选的数'i' 和下一位坐标  继续dfs
    }
}
int main() {
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1; i <= q; ++i) {
        scanf("%d%d%d%d", &z[i].l, &z[i].r, &z[i].d, &z[i].money);
    }
        dfs(1, 1);
        cout<<mmax<<endl;
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值