AtCoder Beginner Contest 165 C.Many Requirements

AtCoder Beginner Contest 165 C.Many Requirements

題目鏈接
在這裏插入圖片描述
很多人看到題目就懵了,我個人感覺這題位置不好,比D要難一點😀,我說的難是指難想一點~
一開始大家肯定比較懵,看來半天讀懂了題目意思,但是卻想不到最優解法,我們不妨觀察一下 N,MN,M 的範圍,立馬想到了暴力,沒錯,我們就暴力列舉所有 A 可能的排列情況即可,用到了 DFSDFS
下面我細說一下這個 DFSDFS,很多人可能不確定到底要不要 returnreturn,首先我們要想,爲什麼要 returnreturn? 其實就是爲了列舉所有情況,而用與不用其實就是你有沒有用 elseelse 的差別,下面我掛兩段代碼供大家參考,一個是用了,一個沒有用:

//用了return的代碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int n,m,q,a[50],b[50],c[50],d[50],ans;
int p[10];

void dfs(int len,int pre){
    if(len==n){
        int sum=0;
        for(int i=0;i<q;i++) if(p[b[i]-1]-p[a[i]-1]==c[i]) sum+=d[i];
        ans=max(ans,sum);
        return;
    }
    for(int i=pre;i<=m;i++){
        p[len]=i;
        dfs(len+1,i);
    }
}

main()
{
    cin>>n>>m>>q;
    for(int i=0;i<q;i++) cin>>a[i]>>b[i]>>c[i]>>d[i];
    dfs(0,1);
    cout<<ans;
    return 0;
}
//沒用return的代碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int n,m,q,a[50],b[50],c[50],d[50],ans;
int p[10];

void dfs(int len,int pre){
    if(len==n){
        int sum=0;
        for(int i=0;i<q;i++) if(p[b[i]-1]-p[a[i]-1]==c[i]) sum+=d[i];
        ans=max(ans,sum);
        return;
    }
    else{
        for(int i=pre;i<=m;i++){
            p[len]=i;
            dfs(len+1,i);
        }
    }
}

main()
{
    cin>>n>>m>>q;
    for(int i=0;i<q;i++) cin>>a[i]>>b[i]>>c[i]>>d[i];
    dfs(0,1);
    cout<<ans;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章