题目C![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/90a42c007c1ce03b4839e4b3a9fefe53.png)
二维dp:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e4+10;
int cnt=0;
int dp[35][maxn];
int T,k,m,n;
int mypow(int a,int b){
int ans=1;
while(b){
if(b&1) ans*=a;
a*=a;
b>>=1;
}
return ans;
}
void init(){
for (int i=0;i<35;i++){
for (int j=0;j<maxn;j++){
dp[i][j]=0;
}
}
cnt=0;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&k,&m,&n);
init();
int f=1;
while(1){
if(mypow(m,cnt)>n) break;
cnt++;
}
for (int i=0;i<=cnt;i++){
dp[i][0]=1;
}
for (int i=1;i<=cnt;i++){
int st=mypow(m,i-1);
for (int j=0;j<=n;j++){
if(j>=st){
dp[i][j]=dp[i-1][j]+dp[i][j-st];
}
else dp[i][j]=dp[i-1][j];
}
}
printf("%d %d\n",k,dp[cnt][n]);
}
return 0;
}
滚动数组优化:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e4+10;
int cnt=0;
int dp[maxn];
int T,k,m,n;
int mypow(int a,int b){
int ans=1;
while(b){
if(b&1) ans*=a;
a*=a;
b>>=1;
}
return ans;
}
int main(){
scanf("%d",&T);
while(T--){
for(int i=0; i<maxn;i++) dp[i]=1;
int cnt=0;
scanf("%d %d %d",&k,&m,&n);
while(1){
if(mypow(m,cnt)>n) break;
cnt++;
}
cnt--;
for(int i=1;i<=cnt;i++){
int st=mypow(m,i);
for(int j=st;j<=n;j++) dp[j]+=dp[j-st];
}
printf("%d %d\n",k,dp[n]);
}
return 0;
}
题目H
分析:对于原数组中的每个数,如果它之后有比它小的数,则这个数一定要放到数组最后去。
现在每次从原数组中取一个数放到数组最后,最后要实现有序。因此放到数组末尾的这些数肯定也是要有序的。所以我们可以进行这样的操作:每次找原数组中的一个数,若他之后有比他小的数,则把这个数放在最后,然后每次保证最后的这些数是有序的就可以了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2020;
int n,k;
int a[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d",&k,&n);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int cnt=0,ans=0;
for (int i=1;i<=n;i++){
for (int j=i+1;j<=n+cnt;j++){
if(a[i]>a[j]){
++cnt;
a[n+cnt]=a[i];
a[i]=0;
ans++;
break;
}
}
if(cnt>1) sort(a+n+1,a+n+cnt);
}
printf("%d %d\n",k,ans);
}
return 0;
}