Many Requirements
传送门
题意:找出长度为N的一串数,后面的数字大于等于前面的数字,最小为1最大为M。有Q个要求,每个要求有不同贡献,求满足贡献总和最大的要求们的数串。
每个要求都是指定数串的第某个数减去第某个数等于某个数。
思路:
这题思路很简单,暴力遍历所有满足后面数字大于等于前面且最小为1最大为M的数串就vans。
问题在于我这个菜鸡DFS有点生疏了编码编了巨久((还在考虑回溯我真的emm
注意此处DFS要传递当前的位置和当前的值!
代码:
#include<bits/stdc++.h>
using namespace std;
int a[55],b[55],c[55],d[55];
int ans[12];
int n,m,q;
int res=0;
void cal(){
int ress=0;
for(int i=1;i<=q;i++){
if(ans[b[i]]-ans[a[i]]==c[i]) ress+=d[i];
}
res=max(res,ress);
}
//当前是第几位,当前的值是多少。
void dfs(int id,int now){
ans[id]=now;
if(id==n){
cal();
return;
}
for(int i=now;i<=m;i++){
dfs(id+1,i);
}
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=q;i++){
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
dfs(0,1);
printf("%d\n",res);
}