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;
}