社区讨论
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 条回复,欢迎继续交流。
正在加载回复...