Educational Codeforces Round 83 (Rated for Div. 2)(D(计数题)E(区间dp))

题目链接

D. Count the Arrays

题意:输入n,m  要你构造n长度的序列,每个数是在1~m 其中有一对数要相同,其他数不相同,并且有个峰值点,就是左边是递增,右边是递减的,问能构造多少个这样的序列

做法:Educational Codeforces Round 83 (Rated for Div. 2)(D(计数题)E(区间dp))_第1张图片

写的不错,偷过来  来自

#include
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const ll mod=998244353;

ll powmod(ll a,ll b) {ll res=1;a%=mod;
assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll n,m;

int main()
{
    printf("%d\n",(0^0));
	scanf("%lld%lld",&n,&m);
	if(n==2){
        puts("0");
        return 0;
	}
    ll ans=0,t=1;
    for(ll i=n-1;i<=m;i++)
    {
        ans=(ans+(i-1)*t%mod*powmod(2,n-3)%mod)%mod;

        t=t*(i-1)%mod;

        t=t*powmod(i-n+2,mod-2)%mod;
    }
    printf("%lld\n",ans);
	return 0;
}

E. Array Shrinking

题意:每次可以选择两个相邻的数并且相等的数进行消除,并且用x+1替代,问最后这个序列最短是多少

做法:一眼区间dp模板题

#include
using namespace std;
const int N=5e2+10;
int dp[N][N],vis[N][N];
int n,a[N];
int main()
{
    for(int i=1;i

 

你可能感兴趣的:(codeforce题解,dp---区间DP)