代码1,运行超时,只过了3点
#include <cstdio>
typedef long long ll;
const ll MAXN = 110;
const ll x = 1000000007;
ll K, L, cnt = 0;
bool vis[MAXN][MAXN];
bool isOk(ll index,ll x) {
int i = index - 1;
if(index == 0) i = index;
for(; i<index+1; i++) {
if(vis[i][x] == true) return false;
}
return true;
}
void DFS(ll index) {
if(index == L) {
cnt = (cnt + 1) % x;
return;
}
int i= 0;
if(index == 0) i++;
for(; i<K; i++) {
if(isOk(index,i)) {
//printf("(%d)",i);
vis[index][i+1] = vis[index][i-1] = true;
DFS(index+1);
//printf("\n");
vis[index][i+1] = vis[index][i-1] = false;
}
}
}
int main() {
scanf("%lld%lld",&K,&L);
DFS(0);
printf("%lld",cnt % x);
return 0;
}
代码2,多阶段问题的动态规划
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF = 1000000007;
ll dp[105][105], sum = 0; //100%的数据,1 <= K,L <= 100
int main() {
int k, l;
cin>>k>>l;
//边界
for(int j=0;j<k;j++)
dp[1][j] = 1;
//状态转移方程
for(int i=2; i<=l; i++) //第i个阶段
for(int j=0; j<k; j++) //第j种情况
for(int t=0; t<k; t++) //计数
if(t!=j-1 && t!=j+1) {
dp[i][j] += dp[i-1][t];
dp[i][j] %= INF;
}
for(int j=1; j<k; j++) {
sum += dp[l][j];
sum %= INF;
}
cout<<sum<<endl;
return 0;
}