4152:最佳加法表达式
没有考虑高精度高精度列式计算,出现runtime error中途崩溃 考虑之后我崩溃了,太不细心的我~~
#include <bits/stdc++.h>
using namespace std;
#define MAX 100
#define inf 9999999999
char a[MAX];
int value[MAX][MAX];
int dp[MAX][MAX];
int main(int argc, char** argv) {
int m;
while(cin>>m){
int len=0;
char x;
while(cin>>x){
a[++len]=x;
for(int i=1;i<=len;i++){
value[i][i]=a[i]-'0';
for(int j=i+1;j<=len;j++){
value[i][j]=value[i][j-1]*10+a[j]-'0';
}
}
for(int j=1;j<=len;j++){
dp[0][j]=value[1][j];
}
for(int i=1;i<=m;i++){
for(int j=1;j<=len;j++){
if(i>j-1)dp[i][j]=inf;
else{
int res=inf;
for(int k=i;k<j;k++)
res=min(res,dp[i-1][k]+value[k+1][j]);
dp[i][j]=res;
}
}
}
}
cout<<dp[m][len];
}
return 0;
}
思想其实与上面的一致,不过是加法的方法和一些数值的表现形式变化了,下面的代码注释之处与运行之处形成对照。
#include <bits/stdc++.h>
using namespace std;
#define MAX 100
struct kkk{
char res[MAX];
};
char a[MAX];
kkk value[MAX][MAX];
kkk dp[MAX][MAX];
void Assign(char a[],char b[],int x,int y){
int k=0;
for(int i=x;i<=y;i++){
b[k++]=a[i];
}
b[k]='\0';
}
void plusy(char a[],char b[],int t1[],int t2[],int ans0[],char ans1[]){
int len1=strlen(a);
int len2=strlen(b);
for(int i=0;i<len1;i++){
t1[len1-1-i]=a[i]-'0';
}
for(int i=0;i<len2;i++){
t2[len2-1-i]=b[i]-'0';
}
int len=max(len1,len2);
for(int k=0;k<len;k++){
ans0[k]+=(t1[k]+t2[k]);
ans0[k+1]=ans0[k]/10;
ans0[k]=ans0[k]%10;
}
if(ans0[len])len++;
while(ans0[len-1]==0&&len>=1){
len--;
}
for(int i=0;i<len;i++){
ans1[len-1-i]=ans0[i]+'0';
}
ans1[len]='\0';
}
int compare(kkk ka,char b[]){
char a[MAX];
memcpy(a,ka.res,sizeof(ka.res));
int len1=strlen(a);
int len2=strlen(b);
if(len1>len2)return 1;
else if(len1<len2)return 0;
else if(len1==len2)
if( strcmp(a,b)>0)return 1;
else return 0;
}
int main(int argc, char** argv) {
int m;
while(cin>>m){
cin>>a+1;
int len=strlen(a+1);
for(int i=1;i<=len;i++){
for(int j=i;j<=len;j++){
Assign(a+1,value[i][j].res,i-1,j-1);
}
}
for(int j=1;j<=len;j++){
Assign(a+1,dp[0][j].res,0,j-1);
}
kkk min;
for(int i=1;i<=m;i++){
for(int j=1;j<=len;j++){
memset(min.res,9,sizeof(min.res));
min.res[MAX]='\0';
if(i<=j-1){
for(int k=i;k<j;k++){
int t1[MAX];memset(t1,0,sizeof(t1));
int t2[MAX];memset(t2,0,sizeof(t2));
int ans0[MAX];memset(ans0,0,sizeof(ans0));
char ans1[MAX];memset(ans1,0,sizeof(ans1));
plusy(dp[i-1][k].res,value[k+1][j].res,t1,t2,ans0,ans1);
if(compare(min,ans1)){
int len1=strlen(ans1);
Assign(ans1,min.res,0,len1-1);
}
}
int minlen=strlen(min.res);
Assign(min.res,dp[i][j].res,0,minlen-1);
}
}
}
cout<<dp[m][len].res<<endl;
}
return 0;
}
最后附上一道 高精度大整数加法 10:大整数加法
#include <bits/stdc++.h>
using namespace std;
#define MAX 200
void plusy(char a[],char b[],int t1[],int t2[],int ans0[],char ans1[]){
int len1=strlen(a);
int len2=strlen(b);
for(int i=0;i<len1;i++){
t1[len1-1-i]=a[i]-'0';
}
for(int i=0;i<len2;i++){
t2[len2-1-i]=b[i]-'0';
}
int len=max(len1,len2);
for(int k=0;k<len;k++){
ans0[k]+=(t1[k]+t2[k]);
ans0[k+1]=ans0[k]/10;
ans0[k]=ans0[k]%10;
}
if(ans0[len]==1)len++;
while(ans0[len-1]==0&&len>1){
len--;
}
for(int i=0;i<len;i++){
ans1[len-1-i]=ans0[i]+'0';
}
ans1[len]='\0';
}
void plusy2(char a[],char b[],int q[],int w[],int c[],char cz[])
{
int lena=strlen(a),lenb=strlen(b),i,j;
for(int i=0,j=lena-1;j>=0;++i,j--)
{
q[i]=a[j]-48;
}
for(int i=0,j=lenb-1;j>=0;++i,j--)
{
w[i]=b[j]-48;
}
int g=max(lena,lenb);
cout<<"t1-> "<<q<<endl;
cout<<"t2-> "<<w<<endl;
cout<<"lenmax-> "<<g<<endl;
for(int i=0;i<g;++i)
{
c[g-i]+=q[i]+w[i];
if(c[g-i]>=10)
{
c[g-i]-=10;
c[g-i-1]+=1;
}
}
if(c[0])
i=0;
else
i=1;
for(j=0;i<=g;++i,j++)
{
cz[j]=c[i]+48;
}
cz[j]='\0';
}
int main(int argc, char** argv) {
int t1[MAX];
int t2[MAX];
int ans0[MAX];
char ans1[MAX];
char a[MAX];
char b[MAX];
cin>>a>>b;
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
memset(ans0,0,sizeof(ans0));
memset(ans1,0,sizeof(ans1));
plusy(a,b,t1,t2,ans0,ans1);
int i=0;
cout<<ans1;
return 0;
}
|