想写点感慨,想了好多,我太菜了,就这样吧。
3、小Q整数分割
小Q决定把一个整数n,分割为k个整数。
每个整数必须大于等于1。
小Q有多少方案。
输入描述:
输入整数n,k.(1<=n,k<=100)
输出描述:
输出方案数。答案对1e9+7取模。
输入样例:
3 3
输出样例:
1
dfs爆搜(80%,缺少去重)
#include <stdio.h>
#include <stdlib.h>
int num = 0;
int dfs(int n, int k){
if(k < 0){
return ;
}
if(k == 0 && n == 0){
num = (num + 1) % (int)(1e9+7);
return ;
}
int i;
for(i=1; i<=n; i++){
dfs(n-i,k-1);
}
return ;
}
int main()
{
int n, k;
scanf("%d %d", &n, &k);
dfs(n, k);
printf("%d\n", num);
return 0;
}
dp做法(100%)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, k;
scanf("%d %d", &n, &k);
int num[105][105];
memset(num, 0, sizeof(int) * 1024);
int i, j, kk;
for(i=1; i<=n; i++){
num[i][1] = 1;
}
for(i=1; i<=n; i++){
for(j=1;j<=k;j++){
if(i > j){
num[i][j] = num[i-1][j-1] + num[i-j][j];
}else{
num[i][j] = 1;
}
}
}
printf("%d\n", num[n][k]);
return 0;
}
4、新型美丽数列
定义美丽数列A: 1. 数列中相邻的数越是靠内相对大小加一,a[2]=a[1]+1,a[n-2]=a[n-1]+1… 2. 距离边缘距离相等的 数的大小相等:a[0] = a[n-1],a[1] = a[n-2]… 通过修改最小的数字使得给定数列变成美丽数列。 修改后的值必须仍是正整数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, a[105], b[105];
scanf("%d", &n);
int i;
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
int min = n;
for(i=0; i<n; i++){
b[i] = a[i];
int j, k;
if(n % 2 == 1){
b[n / 2] = b[i] + n/2 - i;
// printf("****%d", b[n/2]);
j = 0;
while(j + n/2 <n){
b[n/2 + j] = b[n/2] - j;
b[n/2 - j] = b[n/2] - j;
j++;
}
}else{
if(i< n/2){
b[0] = b[i] - i;
j = 0;
while(j<n/2){
b[j] = b[0] + j;
b[n-j-1] = b[j];
j++;
}
}else{
b[n-1] = b[i] - (n-1) +i;
j = 0;
while(j<n/2){
b[j] = b[n-1] + j;
b[n-1-j] = b[j];
j++;
}
}
}
int ii, num = 0;
for(ii=0; ii<n; ii++){
// printf("%d ", b[ii]);
if(b[ii] <=0){
num = n;
}
if(a[ii] != b[ii]){
num ++;
}
}
if(min > num){
min = num;
}
}
printf("%d\n", min);
return 0;
}