【Ybtoj 第21章例5】山谷数【数位DP】

66 篇文章 1 订阅

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


解题思路
设f_{len,last,k}为填了len位,上一位为last,目前上升(k=1)和下降(k=2)状态为k(0表示未知)
记得判前导0。


代码

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

const unsigned long long mod=1e9+7;
int T;
unsigned long long f[110][15][3],c[110];
string n;

unsigned long long dp(int len,int last,int k,int limit,int zero){
	if(!len)
		return !zero;
	if(!limit&&f[len][last][k]!=-1)return f[len][last][k];
	unsigned long long ans=0;
	int maxx=(limit?c[len]:9);
	for(int i=0;i<=maxx;i++)
	{
		if(k==1&&i<last)continue;
		if(zero)ans=(ans+dp(len-1,i,k,limit&&(i==c[len]),zero&&(i==0)))%mod;
		else if(i==last)ans=(ans+dp(len-1,i,k,limit&&(i==c[len]),0))%mod;
		else ans=(ans+dp(len-1,i,(i<last?2:1),limit&&(i==c[len]),0))%mod;
	}
	if(!limit) f[len][last][k]=ans;
	return ans;
}

unsigned long long solve(string a)
{
	memset(f,-1,sizeof(f));
	int pos=0;
	for(int i=a.size()-1;i>=0;i--)
		c[++pos]=a[i]-'0';
	return dp(pos,0,0,1,1);
}

int main(){
	scanf("%d",&T);
	while(T--)
	{
		cin>>n;
		cout<<solve(n)<<endl;
	}
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python 字高程 等高是指使用python编程语言处理字高程据,并将其显示为等高线地图的过程。 首先,我们需要获取字高程的据。可以使用python中的开源库,例如gdal或pillow,读取字高程据的文件。这些库提供了许多方法来读取不同格式的字高程据。 一旦读取了据,我们可以使用python中的科学计算库,如numpy和scipy,对字高程据进行处理。可以计算出每个点的高程值,并将其转换为等高线据。这些库还提供了许多处理和操作字高程据的函和方法,例如插值、平滑和过滤。 在处理完字高程据后,我们可以使用python中的可视化库,例如matplotlib,将据可视化为等高线地图。可以使用等高线绘图函来绘制等高线,其中高程值通过不同的颜色或线条粗细表示。这样,我们可以清晰地看到地形的变化,例如山脉、山谷和平原。 除了绘制等高线地图,我们还可以对等高线据进行其他分析和处理。例如,可以计算地形的坡度和坡向,并绘制为颜色渐变图或箭头地图。这样,我们可以更详细地了解地形的特征和变化。 总而言之,使用python编程语言处理字高程据,并将其显示为等高线地图是一种有效且灵活的方法。Python提供了许多开源库和功能强大的工具,使我们能够轻松地进行字高程据处理和可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值