练习赛地址http://acm.hrbust.edu.cn/vj/index.php?c=contest-contest&cid=70

a.水。。。

b.暴力打表。。。

c.给四个正方形,求一个能覆盖他们的正方形的面积,其实能覆盖两个最大的正方形就一定能覆盖四个正方形,所以输出两个最大正方形的边长和~\(≧▽≦)/~啦啦啦

d.组合数学,dp[i][j],前表示i个里选j个有多少种情况。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const long long maxa = 104;
const long long mod = 1000000007;
long long dp[maxa][maxa*maxa];
long long a[maxa*maxa];
long long s[maxa*maxa];

long long c[maxa*maxa][maxa];
int main(){
    for(long long i=0;i< maxa*maxa;i++)
    {
        for(long long j=0;j<maxa;j++)
        {
            if(!j||i==j)
                c[i][j]=1;
            else
                c[i][j]=c[i-1][j-1]+c[i-1][j];
                c[i][j] %= mod;

        }
    }
    long long n;
    long long cas = 1;
    while(cin>>n){
        memset(dp, 0, sizeof(dp));
        for(long long i =0; i < n; i++){
            cin>>a[i];
            if(i == 0) s[i] = a[i];
            else s[i] = s[i-1]+a[i];
        }
        for(long long i = 0;i < n; i++){
            if(i == 0){
                for(long long j = 0; j <= a[i]; j++){
                    dp[i][j] = 1;
                }
            }else{
                for(long long j = 0; j <= a[i]; j++){
                    for(long long k = 0;k <= s[i-1]; k++){
                        dp[i][j+k] += dp[i-1][k]*(c[j+k][j]);
                        dp[i][j+k] %= mod;
                    }
                }
            }
        }
        long long ans = 0;
        for(long long i = 1; i <= s[n-1]; i++){
            ans += dp[n-1][i];
            ans %= mod;
        }
        cout<<"Case "<<cas++<<": "<<ans<<"\n";
    }
}
View Code

相关文章:

  • 2022-02-28
  • 2022-01-17
  • 2021-11-21
  • 2021-08-18
  • 2021-05-17
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-17
  • 2021-04-12
  • 2021-08-17
  • 2021-06-30
相关资源
相似解决方案