社区讨论

AC了 但是有几个小地方不懂求大佬解惑

P2657[SCOI2009] windy 数参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lpp4m8gh
此快照首次捕获于
2023/12/03 14:53
2 年前
此快照最后确认于
2023/12/03 15:57
2 年前
查看原帖
代码如下
CPP
// Problem: 
//     P2657 [SCOI2009] windy 数
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2657
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=12;
int a[N];
int f[N][10];

void init()
{
	for(int i=0;i<=9;++i) f[1][i]=1;
	for(int i=2;i<N;++i){
		for(int j=0;j<=9;++j){
			for(int k=0;k<=9;++k){
				if(abs(k-j)>=2) f[i][j]+=f[i-1][k];
			}
		}
	}
}

int dp(int x)
{
	if(!x) return 0;
	int cnt=0;
	while(x) a[++cnt]=x%10,x/=10;
    
    int res=0,last=-2;
    for(int i=cnt;i>=1;--i){
    	int now=a[i];
    	for(int j=(i==cnt);j<now;++j){
    		if(abs(j-last)>=2) res+=f[i][j];
    	}
    	
    	if(abs(now-last)<2) break;
    	last=now;
    	if(i==1) res++;
    }
    
    for(int i=1;i<cnt;++i){
    	for(int j=1;j<=9;++j){
    		res+=f[i][j];
    	}
    }
    
    return res;
    
    
}

int main()
{
	init();
	int l,r;
	cin>>l>>r;
	cout<<dp(r)-dp(l-1);
	return 0;
}






我的问题在于 1:为什么int dp()中不能直接从0开始枚举 反而要在后面算cnt-1位的和?我修改了一下发现输出是错的 2.为什么后面算cnt-1位的时候,不能直接for(int j=0;j<=9;++j){ans+=f[cnt-1][j]} 直接从0位加起,不就不用后面的了?我修改了一下发现这个输入也是错的。
话说,这两个感觉是一个问题(

回复

2 条回复,欢迎继续交流。

正在加载回复...