日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【DP】Sam数

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【DP】Sam数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Sam數

題目大意:

問位數為n,且每一位的數字與相鄰數字的差值小于等于2的數有多少個

原題:

題目描述

小G最近發現了一種非常有趣的數,他將這種數稱之為Sam數。Sam數具有以下特征:相鄰兩位的數字之差不超過2。小G還將Sam數按位數進行了分類,他將一個k位Sam數稱之為k階Sam數。但不幸的是小G發現他數不清第k階的Sam數一共有多少個,這個時候機智的他想到了向你求助。

輸入

第一行為一個整數k,含義見題面。

輸出

一行一個整數ans,表示k階的Sam數的個數。
由于第k階Sam數非常多,你只需要輸出ans mod 1,000,000,007。

輸入樣例

輸出樣例

867

說明

【數據規模和約定】

對于30%的數據,1 ≤ k ≤ 6。
對于60%的數據,1 ≤ k ≤ 1000。
對于100%的數據,1 ≤ k ≤ 1000000。

解題思路:

用f[i][j]表示第i位是j的情況有多少種,然后直接等于f[i-1][j±2]的和

代碼:

#include<cstdio> using namespace std; int n; long long ans,a[1000005][15]; int main() {scanf("%d",&n);if (n==1)//特判{printf("10");return 0;}a[1][0]=1;//初始化a[1][1]=1;a[1][2]=1;a[1][3]=1;a[1][4]=1;a[1][5]=1;a[1][6]=1;a[1][7]=1;a[1][8]=1;a[1][9]=1;for (int i=2;i<=n;++i){a[i][0]=(a[i-1][0]+a[i-1][1]+a[i-1][2])%1000000007;//與相鄰的相加a[i][1]=(a[i-1][0]+a[i-1][1]+a[i-1][2]+a[i-1][3])%1000000007;a[i][2]=(a[i-1][0]+a[i-1][1]+a[i-1][2]+a[i-1][3]+a[i-1][4])%1000000007;a[i][3]=(a[i-1][1]+a[i-1][2]+a[i-1][3]+a[i-1][4]+a[i-1][5])%1000000007;a[i][4]=(a[i-1][2]+a[i-1][3]+a[i-1][4]+a[i-1][5]+a[i-1][6])%1000000007;a[i][5]=(a[i-1][3]+a[i-1][4]+a[i-1][5]+a[i-1][6]+a[i-1][7])%1000000007;a[i][6]=(a[i-1][4]+a[i-1][5]+a[i-1][6]+a[i-1][7]+a[i-1][8])%1000000007;a[i][7]=(a[i-1][5]+a[i-1][6]+a[i-1][7]+a[i-1][8]+a[i-1][9])%1000000007;a[i][8]=(a[i-1][6]+a[i-1][7]+a[i-1][8]+a[i-1][9])%1000000007;a[i][9]=(a[i-1][7]+a[i-1][8]+a[i-1][9])%1000000007;}for (int i=1;i<=9;++i)ans=(ans+a[n][i])%1000000007;//求和printf("%lld",ans); }

總結

以上是生活随笔為你收集整理的【DP】Sam数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。