BZOJ 1026 [SCOI2009] windy 디지털 DP?
제목:링크
방법: 디지털 DP?
해석: 디지털 DP 개 귀신, 분명히 디지털 추이
우선 이 데이터 범위에 대해 O(1)는 통과할 수 있습니까?
다시 생각해 보면 틀렸어, 9 번이 제일 크면 9 명이야!
그래서 일종의 상태를 생각할 수 있다. f[i][j]는 길이가 i이고 첫 번째가 j인 windy수이다.
그 다음에 f[i][j]=∑f[i-3-1][k]와 abs(k-3j)>=2
그다음에 디테일 코드가 위치별로 처리가 됐어요.
근데 저 질문 있어요. 여보세요.
왜 내 모든 것은 한 사람만 계산이 틀렸지?다른 분은 맞으시죠?
그래서 나는 좀 파렴치할 수밖에 없었다. 가트판은 1~9번 물어보면 바로 자신에게 돌아간다.
먼저 구덩이를 파다.
코드:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int f[15][15];
int bit[15];
void init()
{
for(int i=0;i<=9;i++)f[1][i]=1;
for(int i=2;i<=10;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
if(abs(j-k)>=2)f[i][j]+=f[i-1][k];
}
}
}
}
int cal(int x)
{
if(x<10)return x;
if(!x)return 0;
int s_bit=10,ans=0;
while(bit[s_bit]>x)s_bit--;
for(int i=1;i<s_bit;i++)
{
for(int j=1;j<=9;j++)
{
ans+=f[i][j];
}
}
int aft=x/bit[s_bit];
x%=bit[s_bit];
for(int i=1;i<aft;i++)ans+=f[s_bit][i];
int pre_bit=aft;
for(int i=s_bit-1;i;i--)
{
int bit_now=x/bit[i];
if(i!=1)
{
for(int j=0;j<bit_now;j++)
{
if(abs(pre_bit-j)>=2)ans+=f[i][j];
}
}else
{
for(int j=0;j<=bit_now;j++)
{
if(abs(pre_bit-j)>=2)ans+=f[i][j];
}
}
if(abs(pre_bit-bit_now)<2)break;
pre_bit=bit_now;
x%=bit[i];
}
return ans;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
init();
bit[1]=1;
for(int i=2;i<=10;i++)bit[i]=bit[i-1]*10;
cal(1);
printf("%d
",cal(b)-cal(a-1));
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
vue 단일 페이지에 여러 개의 echarts 도표가 있을 때의 공용 코드 쓰기html에서: 데이터 처리는 말할 필요가 없다.응, 직접 그림을 그려: 공통 섹션: 이 페이지를 떠날 때 파괴: 추가 정보: Vue + Echarts 차트 표시 및 동적 렌더링 준비 작업 echarts 의존 설치 n...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.