22/09/27

1,cf find amir

题意:有n座城市,标号为1~n,定义标号为i,j的两座城市的距离为(i+j)%(n+1).求走完所有城市所需的最小花费(起点任意).

思路:很明显发现走1—n—2—n-1—3—n-2是最优解,不过答案是偶数跟着上层的奇数的;

所以直接输出(n+1)/2-1即可;

signed main()
{
    quick_cin();
    int n;
    cin>>n;
    cout<<(n+1)/2-1;
    return 0;
}

2,Mio visits ACGN Exhibition

题意:给n*m的矩阵,每个格子里是0或1,从1,1走到n,m,问走到终点且中间经过不少于p个0和q个1的方案数;n,m<=500

一眼dp,状态转移很好写;f[i][j][k]表示走到i,j且经过k个1的方案数;

 if(a[i][j]==1)f[i][j][k]=(f[i][j][k]%mod+f[i-1][j][k-1]%mod+f[i][j-1][k-1]%mod)%mod;

 else f[i][j][k]=(f[i][j][k]%mod+f[i-1][j][k]%mod+f[i][j-1][k]%mod)%mod;

但是空间1e8会炸,需要优化;

dp的空间优化:滚动数组;

用f[0][j][k]表示上一行,f[1][j][k]表示本行;

状态转移方程;(记住最后取模,否则tle!!!)

                if(a[i][j]==1)

                    f[1][j][k]=(f[0][j][k-1]+f[1][j-1][k-1])%mod;

                else

                    f[1][j][k]=(f[0][j][k]+f[1][j-1][k])%mod;

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define rep1(i,a,n) for( int i=(a);i<(n);++i) 
#define rep2(i,a,n) for( int i=(a);i<=(n);++i) 
#define per1(i,n,a) for( int i=(n);i>(a);i--) 
#define per2(i,n,a) for( int i=(n);i>=(a);i--)
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define memset(a,i,b) memset((a),(i),sizeof (b))
#define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
#define pro_q priority_queue
#define eb emplace_back
#define endl "\n"
#define lowbit(m) ((-m)&(m))
#define dbug(y) cout<<(y)<<"\n"
#define dbug2(a,b) cout<<(a)<<" "<<(b)<<"\n"
#define dbug3(a,b,c) cout<<(a)<<" "<<(b)<<" "<<(c)<<"\n"
#define dbug4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<"\n"
#define yi first
#define er second
#define tulun int e[N],ne[N],h[N],w[N],idx;
#define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++;
#define add3(a,b,c) w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
#define T_solve() int T;cin>>T;while(T--)solve();
#define pi 3.14159265358979323846
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<long long,long long> PLL;
typedef double dob;
const int N=1010;
int f[2][510][1005];
int a[510][510];
int n,m,p,q;

int mod=998244353;
signed main()
{
    quick_cin();
    cin>>n>>m>>p>>q;
    rep2(i,1,n)
    rep2(j,1,m)cin>>a[i][j];
    if(a[1][1]==1)f[1][1][1]=1;
    else f[1][1][0]=1;
    rep2(i,1,n)
    {
        rep2(j,1,m)
        {
            if(i==1&&j==1)continue;
            rep2(k,0,1004)
            {
                if(a[i][j]==1)
                    f[1][j][k]=(f[0][j][k-1]+f[1][j-1][k-1])%mod;
                else
                    f[1][j][k]=(f[0][j][k]+f[1][j-1][k])%mod;
            }
        }
        rep2(j,1,m)
        {
            rep2(k,0,1004)
            {
                f[0][j][k]=f[1][j][k];
            }
        }
    }
    int ans=0;
    rep2(i,0,1004)
    {
        int numq=i;
        int nump=n+m-1-numq;
        if(nump>=p&&numq>=q)
        {
            ans=(ans%mod+f[1][m][i]%mod)%mod;
        }
    }
    dbug(ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dull丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值