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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 431C k-Tree(dp)

發布時間:2024/4/11 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 431C k-Tree(dp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一棵無窮大的有根樹,每個節點都有 k 個兒子,每條邊都有權值,分別是 1 ~ k,現在問從根節點向下走,有多少條路徑的權值和等于 n ,且至少存在一條邊權大于等于 d 的邊

題目分析:讀完題感覺像背包問題,花了一個小時想了個三維 dp,四層 for 用來轉移,正確性肯定是沒問題的,只不過有點太畫蛇添足了:

dp[ i ][ j?][ k ]:到了第 i 層,容量為 j ,最大值為 k 時的方案數,轉移的話一層枚舉層數,一層枚舉下一個數字,一層枚舉容量,一層枚舉最大值,非常啰嗦

訓練完看了看別人寫的題解,發現自己真的好菜啊好菜啊好菜啊好菜啊好菜啊

dp[ i ][ 0/1 ] 代表容量為 i 時,是否含有大于等于?d 的邊權的方案數,轉移的話一層循環枚舉當前的容量,一層循環枚舉最后一次的數字用來轉移即可

本來以為 dp 已經入門,足以應付這種簡單 dp,然鵝還是太菜了啊

代碼:
n^2

//#pragma GCC optimize(2) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;const int mod=1e9+7;LL dp[N][N];//dp[i][j]:總和為i,是否包含大于等于d的數的方案數 int main() { #ifndef ONLINE_JUDGE // freopen("data.ans.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n,k,d;scanf("%d%d%d",&n,&k,&d);dp[0][0]=1;for(int i=1;i<=n;i++)//枚舉當前的容量 for(int j=1;j<=k&&j<=i;j++)//枚舉最后一次的數字 {if(j>=d)dp[i][1]=(dp[i][1]+dp[i-j][0]+dp[i-j][1])%mod;else{dp[i][1]=(dp[i][1]+dp[i-j][1])%mod;dp[i][0]=(dp[i][0]+dp[i-j][0])%mod;}}printf("%lld\n",dp[n][1]);return 0; }

n^4

//#pragma GCC optimize(2) //#pragma GCC optimize("Ofast","inline","-ffast-math") //#pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;const int mod=1e9+7;LL dp[N][N][N];//dp[i][j][k]:到了第i個數字,容量為j,最大值為k時的方案數 int main() { #ifndef ONLINE_JUDGE // freopen("data.ans.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n,k,d;scanf("%d%d%d",&n,&k,&d);dp[0][0][0]=1;for(int s=1;s<=n;s++)//枚舉回合 for(int i=1;i<=k;i++)//枚舉數字 for(int j=i;j<=n;j++)//枚舉容量for(int t=0;t<=k;t++)//枚舉最大值 dp[s][j][max(t,i)]=(dp[s][j][max(t,i)]+dp[s-1][j-i][t])%mod;LL ans=0;for(int i=1;i<=n;i++)for(int j=d;j<=k;j++)ans=(ans+dp[i][n][j])%mod;printf("%lld\n",ans);return 0; }

?

總結

以上是生活随笔為你收集整理的CodeForces - 431C k-Tree(dp)的全部內容,希望文章能夠幫你解決所遇到的問題。

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