- 多边形三角剖分的最低得分
题目链接:多边形三角剖分的最低得分
copy from 这里
代码:
class Solution {
public:
int memo[51][51]={0};
inline int w(int i,int j,int k,vector<int>& A)
{
return A[i]*A[j]*A[k];
}
int dfs(int i,int j,vector<int>& A)
{
if(i+1==j)
return 0;
if(memo[i][j]!=0)
return memo[i][j];
memo[i][j]=INT_MAX;
for(int k=i+1;k<j;k++)
{
int ans=dfs(i,k,A)+dfs(k,j,A)+w(i,j,k,A);
memo[i][j]=min(ans,memo[i][j]);
}
return memo[i][j];
}
int minScoreTriangulation(vector<int>& A) {
int n=A.size();
return dfs(0,n-1,A);
}
};
- 移动石子直到连续 II
对于取最大值:
先求出stones[n-1]到stones[0]之间共有多少个空,由于每次移石子不能放两端,故第一次移的时候会直接减去min(stones[n-1]-stones[n-2]-1,stones[1]-stones[0]-1)。
对于最小值:
找出连续的n个空间的,使得其中的石子最多,记为m,则最小的步数就是n-m
这里还有一种情况:如 2,3,4,5,10,如果按上面的计算就是一次,而实际上由于端点不能移到端点,所以是2次,将2移到7的位置,10移到6的位置。其他的情况都会满足n-m.比如1,2,4,6,10,m=3,需要步数位2,可以将10移到5的位置,6移到3的位置。
代码:
class Solution {
public:
vector<int> numMovesStonesII(vector<int>& stones) {
sort(stones.begin(),stones.end());
int n=stones.size();
int mx=stones[n-1]-stones[0]+1-n;
mx-=min(stones[n-1]-stones[n-2]-1,stones[1]-stones[0]-1);
int mi=mx;
int i,j;
i=j=0;
for(i=0;i<n;i++)
{
while(j+1<n&&stones[j+1]-stones[i]+1<=n)
++j;
int cost=n-(j-i+1);
if(j+1-i==n-1&&stones[j]-stones[i]+1==n-1)
cost = 2;
mi=min(mi,cost);
}
return vector<int>{mi,mx};
}
};