1300 -- 【贪心练习】删数问题
Description
输入一个高精度正整数n(n<=240位),去掉其中任意s个数字后剩下的数字按原来次序组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
第一行一个整数n(不超过240位)
第二行一个整数s(s小于n 的位数)
Output
输出最后剩下的最小数。
Sample Input
2178543 4
Sample Output
143
在网上看了那么多,貌似没有我这样用动态规划做的,因为会超longlong,太麻烦了(其实还好)。(望大佬指点)
用高精度的思想外加动态规划如下:
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
long long a[245][245][245],b[245];
int compare(int i,int j) {
int k;
if(a[0][i][j]<a[0][i-1][j]) return -1;
if(a[0][i][j]>a[0][i-1][j]) return 1;
else {
for(k=1; k<=a[0][i][j]; k++) {
if(a[k][i][j]<a[k][i-1][j]) return -1;
if(a[k][i][j]>a[k][i-1][j]) return 1;
}
}
return 0;
}
void print(int l,int n) {
int i,q=1;
while(a[q][l][n]==0&&q<a[0][l][n]) {
q++;
}
for(i=q;i<=a[0][l][n];i++) {
cout<<a[i][l][n];
}
cout<<endl;
}
void cpy1(int i,int j) {
int k;
for(k=0;k<=a[0][i-1][j];k++) {
a[k][i][j]=a[k][i-1][j];
}
}
void cpy2(int i,int j) {
int k=0;
for(k=0;k<=a[0][i-1][j-1];k++) {
a[k][i][j]=a[k][i-1][j-1];
}
}
int main() {
int c,i,j,q;
string s;
cin>>s>>c;
memset(a,0,sizeof(a));
int l=s.length();
s=' '+s;
for(i=1;i<=l;i++) {
b[i]=s[i]-'0';
}
int n=l-c;
if(l<n) {
cout<<0;
return 0;
}
a[0][1][0]=0;
a[1][1][0]=0;
a[0][1][1]=1;
a[1][1][1]=b[1];
for(i=2;i<=l;i++) {
for(j=1;j<=n;j++) {
cpy2(i,j);
a[++a[0][i][j]][i][j]=b[i];
q=compare(i,j);
if(q==1&&i!=j) {//当前这个大了
cpy1(i,j);
}
}
}
print(l,n);
return 0;
}