Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';这个递归算法有什么错?_C++_Algorithm_Sorting_Dynamic Programming_Memoization - Fatal编程技术网

C++ 什么';这个递归算法有什么错?

C++ 什么';这个递归算法有什么错?,c++,algorithm,sorting,dynamic-programming,memoization,C++,Algorithm,Sorting,Dynamic Programming,Memoization,问题陈述: N元置换是从集合{1,2,…,N}中分离出的数的N元序列。例如,序列2,1,4,5,3是一个5元素置换。P是N元置换。您的任务是按升序对P排序。但因为它很简单,我有一个新的规则给你。有两个序列P和Q。P是一个N元素置换,Q最初是空的,通过排序P形成(即,最后Q=1,2,3,…,N)。您必须执行N个步骤来对P进行排序。在第i步中,P有N-i+1个剩余元素,Q有i-1个元素,您必须选择P的一些第x个元素(从N-i+1个可用元素中),并将其放在Q的左侧或右侧。此步骤的成本等于x*i。总成本

问题陈述:

N元置换是从集合{1,2,…,N}中分离出的数的N元序列。例如,序列2,1,4,5,3是一个5元素置换。P是N元置换。您的任务是按升序对P排序。但因为它很简单,我有一个新的规则给你。有两个序列P和Q。P是一个N元素置换,Q最初是空的,通过排序P形成(即,最后Q=1,2,3,…,N)。您必须执行N个步骤来对P进行排序。在第i步中,P有N-i+1个剩余元素,Q有i-1个元素,您必须选择P的一些第x个元素(从N-i+1个可用元素中),并将其放在Q的左侧或右侧。此步骤的成本等于x*i。总成本是各个步骤的成本之和。在N步之后,Q必须是一个升序。你的任务是最小化总成本

输入

输入文件的第一行是T(T≤ 10) ,测试用例的数量。然后对T测试用例进行描述。每个测试用例的描述由两行组成。第一行包含一个整数N(1≤ N≤ 1000). 第二行包含来自集合{1,2,…,N}的N个不同整数,N元素置换P

输出

对于每个测试用例,您的程序应该写一行,其中包含一个整数——排序的最小总成本

输入: 1. 4. 4 1 3 2

输出: 十五

我的解决方案:

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int sz;
int n[1001];
map<int,int>pos;
int solve(int i,int a,int b){
if(a==-1&&b==sz) //if all the elements have been moved 
    return 0;
if(i>sz)
    return INT_MAX;
    int ret = INT_MAX;
    if(a>=0) //select the element from left
        ret = min(ret,solve(i+1,a-1,b)+((i+1)*pos[n[a]]));
    if(b<sz) //select the element from right
        ret = min(ret,solve(i+1,a,b+1)+((i+1)*pos[n[b]]));
return ret;
}

int main()
{
   int t;
   cin>>t;
   while(t--){
        cin>>sz;
   for(int i=0;i<sz;i++){
    int x;
    cin>>x;
    n[i] = x; //value
    pos[x] = i+1; //position of elements of array before sorting
   }
   sort(n,n+sz); //sorting the array
   int ret = INT_MAX;
   for(int i=0;i<sz;i++)  
     ret= min(ret,solve(0,i,i+1));
             cout << ret << endl;

        }
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int sz;
int n[1001];
mappos;
整数解算(整数i,整数a,整数b){
if(a==-1&&b==sz)//如果所有元素都已移动
返回0;
如果(i>sz)
返回INT_MAX;
int ret=int_MAX;
如果(a>=0)//从左侧选择元素
ret=min(ret,求解(i+1,a-1,b)+(i+1)*pos[n[a]]);
如果(b>t);
而(t--){
cin>>sz;
对于(int i=0;i>x;
n[i]=x;//值
pos[x]=i+1;//排序前数组元素的位置
}
排序(n,n+sz);//对数组进行排序
int ret=int_MAX;

对于(int i=0;i而言,一个问题是您是基于pos[n[a]]计算成本的

pos[n[a]]返回原始数组中的位置,但成本应基于当前数组p中的位置(即某些元素移动到Q)


例如,如果p最初是{4,1,2},那么2的位置是x==3,但是在p减少到{1,2}之后,那么2的位置是x==2。

我如何解决这个问题?