dfs

題目描述:ios

 

 

 

 AC代碼:數組

#include<iostream>
#define int long long
using namespace std;
const int N = 30;
int vis[N][30],n,temp[N];
int ans = 0;
string s;

void dfs(int id,int t,int a[])
{
    //判斷是否有越界 
    if(id >= n)
    {
        //對26個字母處理 
        for(int i = 0;i < 26;i++)
            if(a[i] != 0)
                return ;
        ans = max(ans,t);
        return ;
    }
    int newa[N];
    for(int i = 0;i < 26;i++)
        newa[i] = (a[i] + vis[id][i]) % 3;
    dfs(id + 1,t + 1,newa);
    dfs(id + 1,t,a);
}

signed main()
{
    cin >> n;
    for(int j = 1;j <= n;j++)
    {//j=1表示第一個字符串,好比爲AABBCCC,則通過下一個for循環後的結果表明的含義以下:
    //vis[1][0] = 2 爲A的個數
    //vis[1][1] = 2 爲B的個數
    //vis[1][2] = 0 實際上是3個的,可是3個已經知足條件了,就mod3看成0個來處理
    //其餘的字符串也是如此操做
    //最後將全部字符串都存入二維數組vis當中,再對二維數組vis進行深搜 
        cin >> s;
        //一個for循環將全部的字符串轉化爲各個字母的出現次數,用一個二維數組記錄 
        for(int i = 0;i    < s.size();i++)
        {//大寫的A的ASCII碼爲65,s[i] - 'A'實際上少了1,故在右側的賦值語句中須要+1後再根據題意mod3 
            
            vis[j][s[i] - 'A'] = (vis[j][s[i] - 'A'] + 1) % 3;
        }
    }
    //從第一個字符串開始,id初始爲1 
    dfs(1,0,temp);
    cout << ans << endl;
    return 0;
}//vis[1][0] = (vis[1][0] + 1) % 3
相關文章
相關標籤/搜索