python-解决圆桌会议(ZCO,2012)

python-解决圆桌会议(ZCO,2012),python,algorithm,dynamic-programming,Python,Algorithm,Dynamic Programming,骑士们围成一圈坐着。为骑士一号制作甜点需要C[i]。找到最低的费用,这样每对相邻的骑士,至少有一个得到他的甜点。N≤ 10**6 输入 有两行输入。第一行包含一个整数N,即表中的座位数。下一行包含N个空格分隔的整数,每个整数都是骑士甜点的成本,按逆时针顺序在表中列出 输出 输出应该是一行,其中包含一个整数,这是您厨师的最低可能成本 问题参考: .我已经用DP,我的代码试过了 n=int(input()) a=[int(i) for i in input().split()] def ram(x)

骑士们围成一圈坐着。为骑士一号制作甜点需要C[i]。找到最低的费用,这样每对相邻的骑士,至少有一个得到他的甜点。N≤ 10**6

输入

有两行输入。第一行包含一个整数N,即表中的座位数。下一行包含N个空格分隔的整数,每个整数都是骑士甜点的成本,按逆时针顺序在表中列出

输出

输出应该是一行,其中包含一个整数,这是您厨师的最低可能成本

问题参考: .我已经用DP,我的代码试过了

n=int(input())
a=[int(i) for i in input().split()]
def ram(x):
 m=x[0]
 k=0
 for i in range(2,n):
  if k==0:
    m+=min(x[i],x[i-1])
    if min(x[i],x[i-1]) ==x[i]:
     k=1
    else:
     k=0 
  else:
    k=0 
    continue
 return m 
b1=ram(a)
a.insert(0,a[n-1])
a.pop(n)
b2=ram(a)
print(min(b1,b2))
但不幸的是,这是一个错误的答案,请找出错误。建议考虑时间复杂度,小于1秒。 编辑:


这个问题的解决方案基本上需要考虑两个状态

假设您当前处于索引i。现在,您必须决定是否要在最终总和中选择索引i的元素

各国情况如下:

1) 如果您决定索引i处的元素应包含在最终和中,则前一个索引处的元素(即i-1)是否包含并不重要

2) 如果您决定索引i处的元素不应包含在最终和中,则必须包含上一个索引处的元素,即i-1

在您的解决方案中,您只处理状态1,而不处理状态2。因此,您必须在每个索引中保留两个变量以获得最佳的中间答案

以下是示例代码:

function calculate(int arr[], int start, int end){

    dp[start][0] = arr[start];
    dp[start][1] = 0LL;

    for(int i=start+1;i<=end;i++){

        dp[i][1] = dp[i-1][0];  //State 2

        dp[i][0] = arr[i] + min( dp[i-1][1], dp[i-1][0] ); //State 1

    }

    return min( dp[end][0], dp[end][1] );

}
函数计算(int-arr[],int-start,int-end){
dp[start][0]=arr[start];
dp[start][1]=0LL;
对于(int i=开始+1;i
function calculate(int arr[], int start, int end){

    dp[start][0] = arr[start];
    dp[start][1] = 0LL;

    for(int i=start+1;i<=end;i++){

        dp[i][1] = dp[i-1][0];  //State 2

        dp[i][0] = arr[i] + min( dp[i-1][1], dp[i-1][0] ); //State 1

    }

    return min( dp[end][0], dp[end][1] );

}