攻一下动态规划,我好累。
一、数的划分
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int dp[205][10]= {0}; //将i分成j堆的方案数
for(int i=1; i<=n-k+1; i++)
{
dp[i][1]=1;
}
for(int i=1; i<=n; i++)
{
for(int j=2; j<=k; j++)
{
if(i>=j)
dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
//数i分成j堆的方案数 = 数i-1分成j-1堆的方案数 + 数i-j分成j堆的方案数
}
}
cout<<dp[n][k]<<endl;
}
二、偶数个数字三
#include<bits/stdc++.h>
using namespace std;
int f[1005][2];
int main(){
int n;
cin>>n;
f[1][0] = 8;
f[1][1] = 1;
for(int i = 2;i<=n;i++){
f[i][0] = (f[i-1][0]*9+f[i-1][1])%12345;
f[i][1] = (f[i-1][1]*9+f[i-1][0])%12345;
}
cout<<f[n][0];
return 0;
}
三、酒鬼
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 710;
int n , ans, dp[N][2], b[N];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
dp[1][0] = 0;
dp[1][1] = b[1];
for(int i = 1; i <= n; i++) {
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][1], dp[i - 1][2]));
dp[i][1] = dp[i - 1][0] + b[i];
dp[i][2] = dp[i - 1][1] + b[i];
}
ans = max(dp[n][0], max(dp[n][1], dp[n][2]));
printf("%d", ans);
return 0;
}
四、 取数游戏
五、核电站
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,f[55][2];
int main()
{
cin >> n >> m;
f[1][0] = 1;
f[1][1] = 1;
for(int i=2;i<m;i++)
{
f[i][1] = f[i-1][1] + f[i-1][0];// 前 i 个坑,第 i 个坑放的方案
f[i][0] = f[i-1][0] + f[i-1][1];// 前 i 个坑,第 i 个坑不放的方案
// 一样的,都可以随便发
}
// i 比 m 小的情况
f[m][0] = f[m-1][0] + f[m-1][1];
f[m][1] = f[m-1][0] + f[m-1][1] - 1;
for(int i=m+1;i<=n;i++)
{
f[i][0] = f[i-1][0] + f[i-1][1];
f[i][1] = f[i-1][1] + f[i-1][0] - f[i-m][0];
}
cout << f[n][1] + f[n][0];
}