首页 > 其他分享 >AcWing 271杨老师的照相排列

AcWing 271杨老师的照相排列

时间:2022-10-26 00:12:50浏览次数:57  
标签:typedef int memset 35 照相 271 && AcWing define

思路

\(1=<k<= 5\),所以最多会有五个位置,五个位置分配人,即集合为f[a][b][c][d][e]表示五个位置各放了a, b, c, d, e个人的方法的数量,同时h[1]>=h[2]>=h[3]>=h[4]>=h[5],所以后面的层也可以取到和上面一层一样的人数,但是不能超过,因此b<= min(a, s[2])
我们考虑最后一个同学的位置,其实就是五个位置都考虑一下,因此我们需要满足这一层人数减去1也大于等于下一层,那样就可以放在当前位置,同时该层得为正数,不然例如a-1如果小于0就要段错误了

ps: 数据还挺极限的,这f开到f[35][35][35][35][35]就寄了,如果是是32就不会超时,应该是memset上花了很多时间

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define SZ(x) (int) (x).size()
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef vector<int> VI;
typedef double db;

const int N = 32;
int n, s[10];
ll f[N][N][N][N][N];
void solve() {
  memset(s, 0, sizeof(s));
  for (int i = 1; i <= n; i++) cin >> s[i];
  memset(f, 0, sizeof(f));
  f[0][0][0][0][0] = 1; // 哪里都不放人只有一种选择
  for (int a = 0; a <= s[1]; a++) {
    for (int b = 0; b <= min(a, s[2]); b++) {
      for (int c = 0; c <= min(b, s[3]); c++) {
        for (int d = 0; d <= min(c, s[4]); d++) {
          for (int e = 0; e <= min(d, s[5]); e++) {
            ll &x = f[a][b][c][d][e];
            if (a && a-1 >= b) x += f[a-1][b][c][d][e];
            if (b && b-1 >= c) x += f[a][b-1][c][d][e];
            if (c && c-1 >= d) x += f[a][b][c-1][d][e];
            if (d && d-1 >= e) x += f[a][b][c][d-1][e];
            if (e) x += f[a][b][c][d][e-1];
          }
        }
      }
    }
  }
  cout << f[s[1]][s[2]][s[3]][s[4]][s[5]] << '\n';
} 

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  // int tt;
  // cin >> tt;
  while (cin >> n, n) {
    solve();
  }
  return 0;
}

标签:typedef,int,memset,35,照相,271,&&,AcWing,define
From: https://www.cnblogs.com/chelly-algorithm/p/16826898.html

相关文章

  • ACWing - 4493 -- 思维题&&并查集&&dfs
    题目描述环形连通分量思路对于一个无向图中的简单环(环中边的数量等于点的数量),有一个很强的性质:每个点的度数等于\(2\)。那么我们只需要先找出所有的连通块,然后判......
  • AcWing168 生日蛋糕(剪枝)
    原题链接思路的话,就是暴搜加剪枝,中间有个放缩思路看这篇#include<bits/stdc++.h>#definepbpush_back#definefifirst#definesesecond#defineall(x)(x).begi......
  • AcWing107 超快速排序(树状数组找逆序对)
    原题链接思路求到底要和相邻元素交换几次,其实就是求逆序对的数量,有几对逆序对就要交换几次,因为只能相邻的之间交换(超快速排序?冒泡排序!)利用树状数组求逆序对大概想法......
  • AcWing 216. Rainbow的信号
    题目链接:​​传送门​​将权值转化成二进制来看,最多30位枚举每一位并且枚举一个右端点通过这个右端点判断有多少个左端点符合条件,累计贡献要注意单独讨论左端点等于右端......
  • AcWing 100. IncDec序列
    题目链接:​​传送门​​将序列转化成差分数列那么题目就变成了对一个数组可进行三种操作对两个元素一个加一一个减一或对一个元素加一或对一个元素减一其实后面两种操作......
  • AcWing 297. 赤壁之战
    题目链接:很容易想到一个dp:表示长度为,以结尾的上升子序列的个数转移的话就是从到枚举一个表示长度,再从到枚举一个,再从到枚举一个转移就是如果,表示可以接在后面,那么复杂度,......
  • AcWing 296. 清理班次2
    题目链接:​​传送门​​洛谷上的​​P4644[USACO05DEC]CleaningShifts​​​之前没发题解太高兴了数据结构优化dp的例题表示处理到处的最小花费拿一个线段树维护最小值......
  • AcWing 281. 硬币
    题目链接:​​传送门​​只是询问一个可行性那么二进制拆分加一个bitset就行了#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglongll;intn,m,a[A],......
  • AcWing 1221 四平方和
    \(AcWing\)\(1221\).四平方和+自定义排序(重载<)+二分题目传送门一、题目大意四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多\(4\)个正整数的平方和......
  • AcWing80 骰子的点数(线性dp)
    #definepbpush_backclassSolution{public:vector<int>numberOfDice(intn){intf[15][100];//投i次,总和为j的投掷可能memset(f,0,sizeof(......