求助
  • 板块P4905 报纸
  • 楼主ssilrrr
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/1/19 23:22
  • 上次更新2023/10/28 11:53:13
查看原帖
求助
161748
ssilrrr楼主2022/1/19 23:22

双状态dp,hack WA.

#include <bits/stdc++.h>
using namespace std;
bool gcd[301][301];
int mem[301][301];
int tun[301][301]; 
int tune(int i,int j){
	if(i==1||j==1){
		return 0; 
	}else if(tun[i][j]!=-1){
		return tun[i][j];
	}
	else{
		if(gcd[i][j]){
			int r1=min(tune(i-1,j),tune(i,j-1));
			int r2=max(tune(i-1,j),tune(i,j-1));
			if(r1==0){
				if(r2==0) return tun[i][j]=1;
				if(r2==1) return tun[i][j]=2;
				if(r2==2) return tun[i][j]=1;
			}else if(r1==1){
				if(r2==1) return tun[i][j]=2;
				if(r2==2) return tun[i][j]=2;
			}else{
				if(r2==2) return tun[i][j]=1;
			}
		}else return tun[i][j]=0;
	}
}
int dp(int i,int j){
	if(i==1||j==1){
		return 0; 
	}else if(mem[i][j]!=-1){
		return mem[i][j];
	}
	else{
		auto tot=dp(i-1,j)+dp(i,j-1)-dp(i-1,j-1);
		auto tn=tune(i,j);
		if(tn==0){
			;
		}else if(tn==1){
			tot++;
		}else{
			;
		}
		return mem[i][j]=tot;
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			gcd[i][j]=((__gcd(i,j)==1)?0:1);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			mem[i][j]=-1;tun[i][j]=-1; 
		}
	}
	
	cout<<dp(n,n);
}
2022/1/19 23:22
加载中...