标签:++ k好数 cout 代码 ret 之间 但我 using 输入
例子输入
4 2
例子输出
7
数据规模与约定
对于30%的数据,KL <= 106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据。1 <= K,L <= 100。
分析:刚開始我是认为能够通过全排列出全部情况在筛选掉数字相邻之后来求解本问题的,但我发现,不反复挑选l个数字是一个难点。因为l最大到100,也就是说最多可能须要100+个循环来挑选组合数字。之后,我发现相邻进制之间存在着数据联系,第i位数放置j所得到的全部K好数由i-1进制数的全部K好数之和去除与j相邻的两种情况求得。
依照这样的思路,考虑用DP解答。
代码例如以下:
#include<iostream> #include<algorithm> using namespace std; long long d[105][105]; const int INF = 1000000007; long long sum; int main() { int k,l,i,j,t; cin>>k>>l; for(j=0;j<k;j++) d[1][j]=1; for(i=2;i<=l;i++) for(j=0;j<k;j++) for(t=0;t<k;t++) if(t!=j-1&&t!=j+1) { d[i][j]+=d[i-1][t]; d[i][j]%=INF; } sum=0; for(j=1;j<k;j++) { sum+=d[l][j]; sum%=INF; } cout<<sum<<endl; return 0; }
标签:++ k好数 cout 代码 ret 之间 但我 using 输入
原文地址:http://www.cnblogs.com/ljbguanli/p/6744802.html