思路
1.特殊情况的考虑
2.确定dp数组所代表的含义和大小,创建dp数组
3.考虑边界条件,初始赋值dp数组
4.根据状态转移方程遍历求得dp数组
思路分析如下:(草纸写的乱,不过无所谓 我看得懂就成
整理思路,编写代码
这题写的过程很艰难,而且是基于学长的java代码来写的,所以不算是自己完成的。
看到提交结果的俺泪流了下来
其实也不意外,用dp的话 两个for循环,时间复杂度达到了O(n^2).
然后学习了一下那个运行时间0ms的大神的代码。
char * longestPalindrome(char * s){
if(strlen(s)==0||strlen(s)==1) return s;//依旧是先进行特判
int i,count,left,right;
int len=0,start=0;
for(i=0;s[i]!='\0';i+=count)
{
count=1;
left=i-1;
right=i+1;
while(s[i]==s[right])
{
count++;
right++;
}
while(left>=0&&s[left]==s[right]&&s[right]!='\0')
{
left--;
right++;
}
if(right-left-1>len)
{
len=right-left-1;
start=left+1;
}
}
s[start+len]='\0';
return s+start;
}
思路
1.特殊情况的考虑
(1).示例3
if(amont==0)
return 0;
(2).判断coins为空时。
if(coins= =NULL)
return -1;
2.确定dp数组所代表的含义和大小,创建dp数组
int dp[amont+1];
dp[n]表示当前的目标金额是n,至少需要dp[n]个硬币凑出该金额
因为金额最小是0 所以dp数组大小要为amont+1
3.考虑边界条件,初始赋值dp数组
因为dp[0]=0,所以初始赋值时全赋为0
4.根据状态转移方程遍历求得dp数组
dp[n]=min(dp[n-coin]+1,dp[n])
dp[n-coin]+1背后的思想就是母问题拆分子问题。
dp[n]硬币数最小,代表dp[n-coin]硬币数最小。
图源leetcode
假设有k枚硬币:a1,a2…ak凑成了目标amount 因此存在最后一枚硬币ak,那么前面的面值加起来=amount-ak
没错吧?因此我们得到了原问题和子问题关系啦:最少用多少枚硬币拼成amount→最少用多少枚硬币拼成amount-ak
这答案过于生草!
首先要理解
框框句子代表的含义 表明这俩人都很聪明啊 计划着让自己赢呢。所以 每个人先选什么,肯定是以自己要赢为前提。理解了这个才好做题。
不会就列举 列举几项就能发现问题 这个答案太。。省略!
思路
1.特殊情况的考虑
N=1,return false;
N=2,return true;
2.确定dp数组所代表的含义和大小,创建dp数组
bool dp[1001];
3.考虑边界条件,初始赋值dp数组
4.根据状态转移方程遍历求得dp数组
我写的感觉很不dp…
自信点 或许这压根就不是dp?
算了不管了题做出来了就行。。